PGh0bWw+CiAgIDxoZWFkPgogICAgICA8dGl0bGU+SGVhZGVyIDwvdGl0bGU+CiAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgogICAgICA8bWV0YSBuYW1lPSJUZW1wbGF0ZSIgY29udGVudD0iQzpcUFJPR1JBTSBGSUxFU1xNSUNST1NPRlQgT0ZGSUNFXE9GRklDRVxodG1sLmRvdCI+CiAgICAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA1LjAiPgogICAgICA8Ym9vc3Rjb21wcmVzc2VkX3BhaXIuaHBwPgogICA8L2hlYWQ+CiAgIDxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiMwMDAwZmYiIHZsaW5rPSIjODAwMDgwIj4KICAgICAgPGgyPjxpbWcgc3JjPSIuLi8uLi9ib29zdC5wbmciIHdpZHRoPSIyNzYiIGhlaWdodD0iODYiPkhlYWRlciAmbHQ7PGEgaHJlZj0iLi4vLi4vYm9vc3QvZGV0YWlsL2NvbXByZXNzZWRfcGFpci5ocHAiPmJvb3N0L2NvbXByZXNzZWRfcGFpci5ocHA8L2E+Jmd0OzwvaDI+CiAgICAgIDxwPkFsbCBvZiB0aGUgY29udGVudHMgb2YgJmx0O2Jvb3N0L2NvbXByZXNzZWRfcGFpci5ocHAmZ3Q7IGFyZSBkZWZpbmVkIGluc2lkZSAKICAgICAgICAgbmFtZXNwYWNlIGJvb3N0LjwvcD4KICAgICAgPHA+VGhlIGNsYXNzIGNvbXByZXNzZWQgcGFpciBpcyB2ZXJ5IHNpbWlsYXIgdG8gc3RkOjpwYWlyLCBidXQgaWYgZWl0aGVyIG9mIHRoZSAKICAgICAgICAgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBlbXB0eSBjbGFzc2VzLCB0aGVuIHRoZSAiZW1wdHkgYmFzZS1jbGFzcyBvcHRpbWlzYXRpb24iIAogICAgICAgICBpcyBhcHBsaWVkIHRvIGNvbXByZXNzIHRoZSBzaXplIG9mIHRoZSBwYWlyLjwvcD4KICAgICAgPHByZT50ZW1wbGF0ZSAmbHQ7Y2xhc3MgVDEsIGNsYXNzIFQyJmd0OwpjbGFzcyBjb21wcmVzc2VkX3BhaXIKewpwdWJsaWM6Cgl0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7Cgl0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOwoJdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0cyZsdDtmaXJzdF90eXBlJmd0Ozo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOwoJdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0cyZsdDtzZWNvbmRfdHlwZSZndDs6OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKCXR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHMmbHQ7Zmlyc3RfdHlwZSZndDs6OnJlZmVyZW5jZSAgICAgICAgZmlyc3RfcmVmZXJlbmNlOwoJdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0cyZsdDtzZWNvbmRfdHlwZSZndDs6OnJlZmVyZW5jZSAgICAgICBzZWNvbmRfcmVmZXJlbmNlOwoJdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0cyZsdDtmaXJzdF90eXBlJmd0Ozo6Y29uc3RfcmVmZXJlbmNlICBmaXJzdF9jb25zdF9yZWZlcmVuY2U7Cgl0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzJmx0O3NlY29uZF90eXBlJmd0Ozo6Y29uc3RfcmVmZXJlbmNlIHNlY29uZF9jb25zdF9yZWZlcmVuY2U7CgoJICAgICAgICAgY29tcHJlc3NlZF9wYWlyKCkgOiBiYXNlKCkge30KCSAgICAgICAgIGNvbXByZXNzZWRfcGFpcihmaXJzdF9wYXJhbV90eXBlIHgsIHNlY29uZF9wYXJhbV90eXBlIHkpOwoJZXhwbGljaXQgY29tcHJlc3NlZF9wYWlyKGZpcnN0X3BhcmFtX3R5cGUgeCk7CglleHBsaWNpdCBjb21wcmVzc2VkX3BhaXIoc2Vjb25kX3BhcmFtX3R5cGUgeSk7CgoJY29tcHJlc3NlZF9wYWlyJmFtcDsgb3BlcmF0b3I9KGNvbnN0IGNvbXByZXNzZWRfcGFpciZhbXA7KTsKCglmaXJzdF9yZWZlcmVuY2UgICAgICAgZmlyc3QoKTsKCWZpcnN0X2NvbnN0X3JlZmVyZW5jZSBmaXJzdCgpIGNvbnN0OwoKCXNlY29uZF9yZWZlcmVuY2UgICAgICAgc2Vjb25kKCk7CglzZWNvbmRfY29uc3RfcmVmZXJlbmNlIHNlY29uZCgpIGNvbnN0OwoKCXZvaWQgc3dhcChjb21wcmVzc2VkX3BhaXImYW1wOyB5KTsKfTs8L3ByZT4KICAgICAgPHA+VGhlIHR3byBtZW1iZXJzIG9mIHRoZSBwYWlyIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBmaXJzdCgpIAogICAgICAgICBhbmQgc2Vjb25kKCkuIE5vdGUgdGhhdCBub3QgYWxsIG1lbWJlciBmdW5jdGlvbnMgY2FuIGJlIGluc3RhbnRpYXRlZCBmb3IgYWxsIAogICAgICAgICB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZXMuIEluIHBhcnRpY3VsYXIgY29tcHJlc3NlZF9wYWlyIGNhbiBiZSBpbnN0YW50aWF0ZWQgZm9yIAogICAgICAgICByZWZlcmVuY2UgYW5kIGFycmF5IHR5cGVzLCBob3dldmVyIGluIHRoZXNlIGNhc2VzIHRoZSByYW5nZSBvZiBjb25zdHJ1Y3RvcnMgCiAgICAgICAgIHRoYXQgY2FuIGJlIHVzZWQgYXJlIGxpbWl0ZWQuIElmIHR5cGVzIFQxIGFuZCBUMiBhcmUgdGhlIHNhbWUgdHlwZSwgdGhlbiB0aGVyZSAKICAgICAgICAgaXMgb25seSBvbmUgdmVyc2lvbiBvZiB0aGUgc2luZ2xlLWFyZ3VtZW50IGNvbnN0cnVjdG9yLCBhbmQgdGhpcyBjb25zdHJ1Y3RvciAKICAgICAgICAgaW5pdGlhbGlzZXMgYm90aCB2YWx1ZXMgaW4gdGhlIHBhaXIgdG8gdGhlIHBhc3NlZCB2YWx1ZS48L3A+CiAgICAgIDxQPk5vdGUgdGhhdCBpZiBlaXRoZXIgbWVtYmVyIGlzIGEgUE9EIHR5cGUsIHRoZW4gdGhhdCBtZW1iZXIgaXMgbm90IAogICAgICAgICB6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBjb21wcmVzc2VkX3BhaXIgZGVmYXVsdCBjb25zdHJ1Y3RvcjogaXQncyB1cCB0byB5b3UgdG8gCiAgICAgICAgIHN1cHBseSBhbiBpbml0aWFsIHZhbHVlIGZvciB0aGVzZSB0eXBlcyBpZiB5b3Ugd2FudCB0aGVtIHRvIGhhdmUgYSBkZWZhdWx0IAogICAgICAgICB2YWx1ZS48L1A+CiAgICAgIDxwPk5vdGUgdGhhdCBjb21wcmVzc2VkX3BhaXIgY2FuIG5vdCBiZSBpbnN0YW50aWF0ZWQgaWYgZWl0aGVyIG9mIHRoZSB0ZW1wbGF0ZSAKICAgICAgICAgYXJndW1lbnRzIGlzIGEgdW5pb24gdHlwZSwgdW5sZXNzIHRoZXJlIGlzIGNvbXBpbGVyIHN1cHBvcnQgZm9yIAogICAgICAgICBib29zdDo6aXNfdW5pb24sIG9yIGlmIGJvb3N0Ojppc191bmlvbiBpcyBzcGVjaWFsaXNlZCBmb3IgdGhlIHVuaW9uIHR5cGUuPC9wPgogICAgICA8cD5GaW5hbGx5LCBhIHdvcmQgb2YgY2F1dGlvbiBmb3IgVmlzdWFsIEMrKyA2IHVzZXJzOiBpZiBlaXRoZXIgYXJndW1lbnQgaXMgYW4gCiAgICAgICAgIGVtcHR5IHR5cGUsIHRoZW4gYXNzaWduaW5nIHRvIHRoYXQgbWVtYmVyIHdpbGwgcHJvZHVjZSBtZW1vcnkgY29ycnVwdGlvbiwgCiAgICAgICAgIHVubGVzcyB0aGUgZW1wdHkgdHlwZSBoYXMgYSAiZG8gbm90aGluZyIgYXNzaWdubWVudCBvcGVyYXRvciBkZWZpbmVkLiBUaGlzIGlzIAogICAgICAgICBkdWUgdG8gYSBidWcgaW4gdGhlIHdheSBWQzYgZ2VuZXJhdGVzIGltcGxpY2l0IGFzc2lnbm1lbnQgb3BlcmF0b3JzLjwvcD4KICAgICAgPGgzPkFja25vd2xlZGdlbWVudHM8L2gzPgogICAgICA8cD5CYXNlZCBvbiBjb250cmlidXRpb25zIGJ5IFN0ZXZlIENsZWFyeSwgQmVtYW4gRGF3ZXMsIEhvd2FyZCBIaW5uYW50IGFuZCBKb2huIAogICAgICAgICBNYWRkb2NrLjwvcD4KICAgICAgPHA+TWFpbnRhaW5lZCBieSA8YSBocmVmPSJtYWlsdG86am9obkBqb2hubWFkZG9jay5jby51ayI+Sm9obiBNYWRkb2NrPC9hPiwgdGhlIAogICAgICAgICBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnIj53d3cuYm9vc3Qub3JnPC9hPiwgCiAgICAgICAgIGFuZCB0aGUgYm9vc3QgZGlzY3Vzc2lvbiBsaXN0IGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cueWFob29ncm91cHMuY29tL2xpc3QvYm9vc3QiPnd3dy55YWhvb2dyb3Vwcy5jb20vbGlzdC9ib29zdDwvYT4uPC9wPgogICAgICA8aHI+CiAgICAgIDxwPlJldmlzZWQKICAgICAgPCEtLXdlYmJvdCBib3Q9IlRpbWVzdGFtcCIgUy1UeXBlPSJFRElURUQiIFMtRm9ybWF0PSIlZCAlQiAlWSIgc3RhcnRzcGFuIC0tPjA3IE5vdmVtYmVyIDIwMDc8IS0td2ViYm90IGJvdD0iVGltZXN0YW1wIiBlbmRzcGFuIGktY2hlY2tzdW09IjQwMzM4IiAtLT48L3A+CiAgICAgIDxwPqkgQ29weXJpZ2h0IEJlbWFuIERhd2VzLCAyMDAwLjwvcD4KPHA+RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiBTZWUKPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij53d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT48L3A+CgogICA8L2JvZHk+CjwvaHRtbD4=