PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9Tb2Z0UXVhZCBTb2Z0d2FyZS8vRFREIEhvVE1ldGFMIFBSTyA1LjA6OjE5OTgxMjE3OjpleHRlbnNpb25zIHRvIEhUTUwgNC4wLy9FTiIgImhtcHJvNS5kdGQiPgoKPEhUTUw+Cgo8SEVBRD4KPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KPFRJVExFPkluX3BsYWNlX2ZhY3RvcnkgRG9jdW1lbnRhdGlvbjwvVElUTEU+CjwvSEVBRD4KCjxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiIFZMSU5LPSIjODAwMDgwIj4KPEgyIGFsaWduPSJsZWZ0Ij48SU1HIFNSQz0iLi4vLi4vYm9vc3QucG5nIiBXSURUSD0iMjc2IiBIRUlHSFQ9Ijg2Ij48L0gyPgoKPGJsb2NrcXVvdGU+CiAgPGJsb2NrcXVvdGU+CiAgICA8YmxvY2txdW90ZT4KICAgICAgPGJsb2NrcXVvdGU+CiAgICAgICAgPGJsb2NrcXVvdGU+CiAgICAgICAgICA8YmxvY2txdW90ZT4KPEgyIGFsaWduPSJsZWZ0Ij5IZWFkZXIgJmx0OzxBCkhSRUY9Ii4uLy4uL2Jvb3N0L3V0aWxpdHkvaW5fcGxhY2VfZmFjdG9yeS5ocHAiPmJvb3N0L3V0aWxpdHkvaW5fcGxhY2VfZmFjdG9yeS5ocHA8L0E+Jmd0OyA8L0gyPgoKPEgyIGFsaWduPSJsZWZ0Ij5IZWFkZXIgJmx0OzxBCkhSRUY9Ii4uLy4uL2Jvb3N0L3V0aWxpdHkvdHlwZWRfaW5fcGxhY2VfZmFjdG9yeS5ocHAiPmJvb3N0L3V0aWxpdHkvdHlwZWRfaW5fcGxhY2VfZmFjdG9yeS5ocHA8L0E+Jmd0OyA8L0gyPgoKICAgICAgICAgIDwvYmxvY2txdW90ZT4KICAgICAgICA8L2Jsb2NrcXVvdGU+CiAgICAgIDwvYmxvY2txdW90ZT4KICAgIDwvYmxvY2txdW90ZT4KICA8L2Jsb2NrcXVvdGU+CjwvYmxvY2txdW90ZT4KPHA+Jm5ic3A7PC9wPgoKPEgyPkNvbnRlbnRzPC9IMj4KPERMIENMQVNTPSJwYWdlLWluZGV4Ij4KICA8RFQ+PEEgSFJFRj0iI21vdCI+TW90aXZhdGlvbjwvQT48L0RUPgogIDxEVD48QSBIUkVGPSIjZnJhbWV3b3JrIj5GcmFtZXdvcms8L0E+PC9EVD4KICA8RFQ+PEEgSFJFRj0iI3NwZWNpZmljYXRpb24iPlNwZWNpZmljYXRpb248L0E+PC9EVD4KICA8RFQ+PEEgSFJFRj0iI2NvbnRhaW5lci11c2FnZSI+Q29udGFpbmVyLXNpZGUgVXNhZ2U8L0E+PC9EVD4KICA8RFQ+PEEgSFJFRj0iI3VzZXItdXNhZ2UiPlVzZXItc2lkZSBVc2FnZTwvQT48L0RUPgo8L0RMPgoKPEhSPgoKPEgyPjxBIE5BTUU9Im1vdCI+PC9BPk1vdGl2YXRpb248L0gyPgoKPHA+U3VwcG9zZSB3ZSBoYXZlIGEgY2xhc3M8L3A+CjxwcmU+c3RydWN0IFgKewogIFggKCBpbnQsIHN0ZDo6OnN0cmluZyApIDsKfSA7PC9wcmU+CjxwPkFuZCBhIGNvbnRhaW5lciBmb3IgaXQgd2hpY2ggc3VwcG9ydHMgYW4gZW1wdHkgc3RhdGUgKHRoYXQgaXMsIHdoaWNoIGNhbiBjb250YWluIHplcm8gb2JqZWN0cyk6PC9wPgo8cHJlPnN0cnVjdCBDCnsKICAgQygpIDogY29udGFpbmVkXygwKSB7fQogIH5DKCkgeyBkZWxldGUgY29udGFpbmVkXyA7IH0KICBYKiBjb250YWluZWRfIDsKfSA7PC9wcmU+CjxwPkEgY29udGFpbmVyIGRlc2lnbmVkIHRvIHN1cHBvcnQgYW4gZW1wdHkgc3RhdGUgdHlwaWNhbGx5IGRvZXNuJ3QgcmVxdWlyZSB0aGUgY29udGFpbmVkIHR5cGUgdG8gYmUgRGVmYXVsdENvbnN0cnVjdGlibGUsCmJ1dCBpdCB0eXBpY2FsbHkgcmVxdWlyZXMgaXQgdG8gYmUgQ29weUNvbnN0cnVjdGlibGUgYXMgYSBtZWNoYW5pc20gdG8KaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IHRvIHN0b3JlOjwvcD4KPHByZT5zdHJ1Y3QgQwp7CiAgIEMoKSA6IGNvbnRhaW5lZF8oMCkge30KICAgQyAoIFggY29uc3QmIHYgKSA6IGNvbnRhaW5lZF8gKCBuZXcgWCh2KSApIHt9CiAgfkMoKSB7IGRlbGV0ZSBjb250YWluZWRfIDsgfQogIFgqIGNvbnRhaW5lZF8gOwp9IDs8L3ByZT4KPHA+VGhlcmUgaXMgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHRoaXM6IHNpbmNlIHRoZSBtZWNoYW5pc20gdXNlZCB0byBpbml0aWFsaXplIHRoZSBzdG9yZWQgb2JqZWN0IGlzIGNvcHkgY29uc3RydWN0aW9uLAp0aGVyZSBtdXN0IGV4aXN0IGEgcHJldmlvdXNseSBjb25zdHJ1Y3RlZCBzb3VyY2Ugb2JqZWN0IHRvIGNvcHkgZnJvbS4gVGhpcwpvYmplY3QgaXMgbGlrZWx5IHRvIGJlIHRlbXBvcmFyeSBhbmQgc2VydmUgbm8gcHVycG9zZSBiZXNpZGVzIGJlaW5nIHRoZSBzb3VyY2U8L3A+CjxwcmU+dm9pZCBmb28oKQp7CiAgLy8gVGVtcG9yYXJ5IG9iamVjdCBjcmVhdGVkLgogIEMgYyggWCgxMjMsImhlbGxvIikgKSA7Cn0KPC9wcmU+CjxwPkEgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIGlzIHRvIHN1cHBvcnQgZGlyZWN0IGNvbnN0cnVjdGlvbiBvZiB0aGUgY29udGFpbmVkCm9iamVjdCByaWdodCBpbiB0aGUgY29udGFpbmVyJ3Mgc3RvcmFnZS48YnI+CkluIHRoaXMgc2NoZW1lLCB0aGUgdXNlciBzdXBwbGllcyB0aGUgYXJndW1lbnRzIGZvciB0aGUgWCBjb25zdHJ1Y3RvcgpkaXJlY3RseSB0byB0aGUgY29udGFpbmVyOjwvcD4KPHByZT5zdHJ1Y3QgQwp7CiAgIEMoKSA6IGNvbnRhaW5lZF8oMCkge30KICAgQyAoIFggY29uc3QmIHYgKSA6IGNvbnRhaW5lZF8gKCBuZXcgWCh2KSApIHt9CiAgIEMgKCBpbnQgYTAsIHN0ZDo6c3RyaW5nIGExICkgOiBjb250YWluZWRfICggbmV3IFgoYTAsYTEpICkge30KICB+QygpIHsgZGVsZXRlIGNvbnRhaW5lZF8gOyB9CiAgWCogY29udGFpbmVkXyA7Cn0gOzwvcHJlPgo8cHJlPnZvaWQgZm9vKCkKewogIC8vIFdyYXBwZWQgb2JqZWN0IGNvbnN0cnVjdGVkIGluLXBsYWNlCiAgLy8gTm8gdGVtcG9yYXJ5IGNyZWF0ZWQuCiAgQyBjKDEyMywiaGVsbG8iKSA7Cn0KPC9wcmU+CjxwPkNsZWFybHksIHRoaXMgc29sdXRpb24gZG9lc24ndCBzY2FsZSB3ZWxsIHNpbmNlIHRoZSBjb250YWluZXIgbXVzdCBkdXBsaWNhdGUgYWxsIHRoZSBjb25zdHJ1Y3RvciBvdmVybG9hZHMgZnJvbSB0aGUgY29udGFpbmVkIHR5cGUKKGF0IGxlYXN0IGFsbCB0aG9zZSB3aGljaCBhcmUgdG8gYmUgc3VwcG9ydGVkIGRpcmVjdGx5IGluIHRoZSBjb250YWluZXIpLjwvcD4KCjxIMj48QSBOQU1FPSJmcmFtZXdvcmsiPjwvQT5GcmFtZXdvcms8L0gyPgo8cD4KVGhpcyBsaWJyYXJ5IHByb3Bvc2VzIGEgZnJhbWV3b3JrIHRvIGFsbG93IHNvbWUgY29udGFpbmVycyB0byBkaXJlY3RseSBjb250cnVjdCBjb250YWluZWQgb2JqZWN0cyBpbi1wbGFjZSB3aXRob3V0IHJlcXVpcmluZwp0aGUgZW50aXJlIHNldCBvZiBjb25zdHJ1Y3RvciBvdmVybG9hZHMgZnJvbSB0aGUgY29udGFpbmVkIHR5cGUuIEl0IGFsc28gYWxsb3dzIHRoZSBjb250YWluZXIgdG8gcmVtb3ZlIHRoZSBDb3B5Q29uc3R1Y3RpYmxlCnJlcXVpcmVtZW50IGZyb20gdGhlIGNvbnRhaW5lZCB0eXBlIHNpbmNlIG9iamVjdHMgY2FuIGJlIGRpcmVjdGx5IGNvbnN0cnVjdGVkIGluLXBsYWNlIHdpdGhvdXQgbmVlZCBvZiBhIGNvcHkuPGJyPgpUaGUgb25seSByZXF1aXJlbWVudCBvbiB0aGUgY29udGFpbmVyIGlzIHRoYXQgaXQgbXVzdCBwcm92aWRlIHByb3BlciBzdG9yYWdlICh0aGF0IGlzLCBjb3JyZWN0bHkgYWxpZ25lZCBhbmQgc2l6ZWQpLgpOYXR1cmFsbHksIHRoZSBjb250YWluZXIgd2lsbCB0eXBpY2FsbHkgc3VwcG9ydCB1bmluaXRpYWxpemVkIHN0b3JhZ2UgdG8gYXZvaWQgdGhlIGluLXBsYWNlIGNvbnN0cnVjdGlvbiB0byBvdmVycmlkZQphIGZ1bGx5LWNvbnN0cnVjdGVkIG9iamVjdCAoYXMgdGhpcyB3b3VsZCBkZWZlYXQgdGhlIHB1cnBvc2Ugb2YgaW4tcGxhY2UgY29uc3RydWN0aW9uKQo8L3A+CjxwPkZvciB0aGlzIHB1cnBvc2UsIHRoZSBmcmFtZXdvcmsgcHJvdmlkZXMgdHdvIGZhbWlsaWVzIG9mIGNsYXNzZXMgY29sbGVjdGl2ZWx5IGNhbGxlZDogSW5QbGFjZUZhY3RvcmllcyBhbmQgVHlwZWRJblBsYWNlRmFjdG9yaWVzLjxicj4KRXNzZW50aWFsbHksIHRoZXNlIGNsYXNzZXMgaG9sZCBhIHNlcXVlbmNlIG9mIGFjdHVhbCBwYXJhbWV0ZXJzIGFuZCBhIG1ldGhvZCB0byBjb250cnVjdCBhbiBvYmplY3QgaW4gcGxhY2UgdXNpbmcgdGhlc2UgcGFyYW1ldGVycy4KRWFjaCBtZW1iZXIgb2YgdGhlIGZhbWlseSBkaWZmZXJzIG9ubHkgaW4gdGhlIG51bWJlciAoYW5kIHR5cGUpIG9mIHRoZSBwYXJhbWV0ZXIgbGlzdC4gVGhlIGZpcnN0IGZhbWlseQp0YWtlcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGNvbnN0cnVjdCBkaXJlY3RseSBpbiBtZXRob2QgcHJvdmlkZWQgZm9yIHRoYXQKcHVycG9zZSwgd2hlcmVhcyB0aGUgc2Vjb25kIGZhbWlseSBpbmNvcnBvcmF0ZXMgdGhhdCB0eXBlIGluIHRoZSBmYWN0b3J5IGNsYXNzCml0c2VsZi4uPC9wPgo8cD5Gcm9tIHRoZSBjb250YWluZXIgUE9WLCB1c2luZyB0aGUgZnJhbWV3b3JrIGFtb3VudHMgdG8gY2FsbGluZyB0aGUgZmFjdG9yeSdzIG1ldGhvZCB0byBjb250cnVjdCB0aGUgb2JqZWN0IGluIHBsYWNlLgpGcm9tIHRoZSB1c2VyIFBPViwgaXQgYW1vdW50cyB0byBjcmVhdGluZyB0aGUgcmlnaHQgZmFjdG9yeSBvYmplY3QgdG8gaG9sZCB0aGUgcGFyYW1ldGVycyBhbmQgcGFzcyBpdCB0byB0aGUgY29udGFpbmVyLjxicj4KVGhlIGZvbGxvd2luZyBzaW1wbGlmaWVkIGV4YW1wbGUgc2hvd3MgdGhlIGJhc2ljIGlkZWEuIEEgY29tcGxldGUgZXhhbXBsZSBmb2xsb3dzIHRoZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZnJhbWV3b3JrOjwvcD4KPHByZT5zdHJ1Y3QgQwp7CiAgIHRlbXBsYXRlJmx0O2NsYXNzIEluUGxhY2VGYWN0b3J5Jmd0OwogICBDICggSW5QbGFjZUZhY3RvcnkgY29uc3QmIGFGYWN0b3J5ICkKICAgIDoKICAgIGNvbnRhaW5lZF8gKCB1bmluaXRpYWxpemVkX3N0b3JhZ2UoKSApCiAgIHsKICAgICBhRmFjdG9yeS50ZW1wbGF0ZSBhcHBseSZsdDtYJmd0Oyhjb250YWluZWRfKTsKICAgfQoKICB+QygpIAogIHsgCiAgICBjb250YWluZWRfIC0+IFg6On5YKCk7CiAgICBkZWxldGVbXSBjb250YWluZWRfIDsgCiAgfQoKICBjaGFyKiB1bmluaXRpYWxpemVkX3N0b3JhZ2UoKSB7IHJldHVybiBuZXcgY2hhcltzaXplb2YoWCldIDsgfQoKICBjaGFyKiBjb250YWluZWRfIDsKfSA7Cgp2b2lkIGZvbygpCnsKICBDIGMoIGluX3BsYWNlKDEyMywiaGVsbG8iKSApIDsKfQo8L3ByZT4KCjxIUj4KCjxIMj48QSBOQU1FPSJzcGVjaWZpY2F0aW9uIj5TcGVjaWZpY2F0aW9uPC9BPjwvSDI+Cgo8cD5UaGUgZm9sbG93aW5nIGlzIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGZhbWlseSBvZiAnaW5fcGxhY2VfZmFjdG9yeScgY2xhc3NlcywgYWxvbmcgd2l0aCBpdHMgY29ycmVzcG9uZGluZyBoZWxwZXIgdGVtcGxhdGUgZnVuY3Rpb24uClRoZSByZXN0IG9mIHRoZSBmYW1pbHkgdmFyaWVzIG9ubHkgaW4gdGhlIG51bWJlciBhbmQgdHlwZSBvZiB0ZW1wbGF0ZSAoYW5kIGNvbnN0cnVjdG9yKSBwYXJhbWV0ZXJzLjwvcD4KPFBSRT5uYW1lc3BhY2UgYm9vc3QgewoKc3RydWN0IGluX3BsYWNlX2ZhY3RvcnlfYmFzZSB7fSA7Cgp0ZW1wbGF0ZSZsdDtjbGFzcyBBMCZndDsKY2xhc3MgaW5fcGxhY2VfZmFjdG9yeSA6IHB1YmxpYyBpbl9wbGFjZV9mYWN0b3J5X2Jhc2UKewogIHB1YmxpYzo8L1BSRT4KCjxQUkU+ICAgIGluX3BsYWNlX2ZhY3RvcnkgKCBBMCBjb25zdCYgYTAgKSA6IG1fYTAoYTApIHt9CgogICAgdGVtcGxhdGUmbHQ7IGNsYXNzIFQgJmd0OwogICAgdm9pZCBhcHBseSAoIHZvaWQqIGFkZHJlc3MgKSBjb25zdAogICAgewogICAgICBuZXcgKGFkZHJlc3MpIFQobV9hMCk7CiAgICB9CgogIHByaXZhdGU6PC9QUkU+Cgo8UFJFPiAgICBBMCBjb25zdCYgbV9hMCA7Cn0gOwoKdGVtcGxhdGUmbHQ7Y2xhc3MgQTAmZ3Q7CmluX3BsYWNlX2ZhY3RvcnkmbHQ7QTAmZ3Q7IGluX3BsYWNlICggQTAgY29uc3QmIGEwICkKewogIHJldHVybiBpbl9wbGFjZV9mYWN0b3J5Jmx0O0EwJmd0OyhhMCk7Cn0KPC9QUkU+Cgo8cD5TaW1pbGFybHksIHRoZSBmb2xsb3dpbmcgaXMgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgZmFtaWx5IG9mICd0eXBlZF9pbl9wbGFjZV9mYWN0b3J5JyBjbGFzc2VzLCBhbG9uZyB3aXRoIGl0cyBjb3JyZXNwb25kaW5nCmhlbHBlciB0ZW1wbGF0ZSBmdW5jdGlvbi4gVGhlIHJlc3Qgb2YgdGhlIGZhbWlseSB2YXJpZXMgb25seSBpbiB0aGUgbnVtYmVyIGFuZCB0eXBlIG9mIHRlbXBsYXRlIChhbmQgY29uc3RydWN0b3IpIHBhcmFtZXRlcnMuPC9wPgo8UFJFPm5hbWVzcGFjZSBib29zdCB7CgpzdHJ1Y3QgdHlwZWRfaW5fcGxhY2VfZmFjdG9yeV9iYXNlIHt9IDsKCnRlbXBsYXRlJmx0O2NsYXNzIFQsIGNsYXNzIEEwJmd0OwpjbGFzcyB0eXBlZF9pbl9wbGFjZV9mYWN0b3J5IDogcHVibGljIHR5cGVkX2luX3BsYWNlX2ZhY3RvcnlfYmFzZQp7CiAgcHVibGljOjwvUFJFPgoKPFBSRT4gICAgdHlwZWRfaW5fcGxhY2VfZmFjdG9yeSAoIEEwIGNvbnN0JiBhMCApIDogbV9hMChhMCkge30KCiAgICB2b2lkIGFwcGx5ICggdm9pZCogYWRkcmVzcyApIGNvbnN0CiAgICB7CiAgICAgIG5ldyAoYWRkcmVzcykgVChtX2EwKTsKICAgIH0KCiAgcHJpdmF0ZTo8L1BSRT4KCjxQUkU+ICAgIEEwIGNvbnN0JiBtX2EwIDsKfSA7Cgp0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBBMCZndDsKdHlwZWRfaW5fcGxhY2VfZmFjdG9yeSZsdDtBMCZndDsgaW5fcGxhY2UgKCBBMCBjb25zdCYgYTAgKQp7CiAgcmV0dXJuIHR5cGVkX2luX3BsYWNlX2ZhY3RvcnkmbHQ7VCxBMCZndDsoYTApOwp9PC9QUkU+Cgo8UFJFPn0KPC9QUkU+Cgo8cD5BcyB5b3UgY2FuIHNlZSwgdGhlICdpbl9wbGFjZV9mYWN0b3J5JyBhbmQgJ3R5cGVkX2luX3BsYWNlX2ZhY3RvcnknIHRlbXBsYXRlIGNsYXNzZXMgdmFyaWVzIG9ubHkgaW4gdGhlIHdheSB0aGV5IHNwZWNpZnkKdGhlIHRhcmdldCB0eXBlOiBpbiB0aGUgZmlyc3QgZmFtaWx5LCB0aGUgdHlwZSBpcyBnaXZlbiBhcyBhIHRlbXBsYXRlIGFyZ3VtZW50IHRvIHRoZSBhcHBseSBtZW1iZXIgZnVuY3Rpb24gd2hpbGUgaW4gdGhlCnNlY29uZCBpdCBpcyBnaXZlbiBkaXJlY3RseSBhcyBwYXJ0IG9mIHRoZSBmYWN0b3J5IGNsYXNzLjxicj4KV2hlbiB0aGUgY29udGFpbmVyIGhvbGRzIGEgdW5pcXVlIG5vbi1wb2x5bW9ycGhpYyB0eXBlIChzdWNoIGFzIHRoZSBjYXNlIG9mIEJvb3N0Lk9wdGlvbmFsKSwgaXQga25vd3MgdGhlIGV4YWN0IGR5bmFtaWMtdHlwZQpvZiB0aGUgY29udGFpbmVkIG9iamVjdCBhbmQgY2FuIHBhc3MgaXQgdG8gdGhlIGFwcGx5KCkgbWV0aG9kIG9mIGEgKG5vbi10eXBlZCkgZmFjdG9yeS4KSW4gdGhpcyBjYXNlLCBlbmQgdXNlcnMgY2FuIHVzZSBhbiAnaW5fcGxhY2VfZmFjdG9yeScgaW5zdGFuY2Ugd2hpY2ggY2FuIGJlIGNvbnN0cnVjdGVkIHdpdGhvdXQgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBjb25zdHJ1Y3QuPGJyPgpIb3dldmVyLCBpZiB0aGUgY29udGFpbmVyIGhvbGRzIGhldGVyb2dlbmVvdXMgb3IgcG9seW1vcnBoaWMgb2JqZWN0cyAoc3VjaCBhcyB0aGUgY2FzZSBvZiBCb29zdC5WYXJpYW50KSwgdGhlIGR5bmFtaWMtdHlwZQpvZiB0aGUgb2JqZWN0IHRvIGJlIGNvbnN0cnVjdGVkIG11c3QgYmUga25vd24gYnkgdGhlIGZhY3RvcnkgaXRzbGVmLiBJbiB0aGlzIGNhc2UsIGVuZCB1c2VycyBtdXN0IHVzZSBhICd0eXBlZF9pbl9wbGFjZV9mYWN0b3J5JwppbnN0ZWFkLjwvcD4KCjxIUj4KCjxoMj48QSBOQU1FPSJjb250YWluZXItdXNhZ2UiPkNvbnRhaW5lci1zaWRlIFVzYWdlPC9hPjwvaDI+Cgo8cD5BcyBzaG93biBpbiB0aGUgaW50cm9kdWN0b3J5IHNpbXBsaWZpZWQgZXhhbXBsZSwgdGhlIGNvbnRhaW5lciBjbGFzcyBtdXN0CmNvbnRhaW4gbWV0aG9kcyB0aGF0IGFjY2VwdCBhbiBpbnN0YW5jZSBvZgp0aGVzZSBmYWN0b3JpZXMgYW5kIHBhc3MgdGhlIG9iamVjdCdzIHN0b3JhZ2UgdG8gdGhlIGZhY3RvcnkncyBhcHBseSBtZXRob2QuPGJyPgpIb3dldmVyLCB0aGUgdHlwZSBvZiB0aGUgZmFjdG9yeSBjbGFzcyBjYW5ub3QgYmUgY29tcGxldGx5IHNwZWNpZmllZCBpbiB0aGUgY29udGFpbmVyIGNsYXNzIGJlY2F1c2UgdGhhdCB3b3VsZApkZWZlYXQgdGhlIHdob2xlIHB1cnBvc2Ugb2YgdGhlIGZhY3RvcmllcyB3aGljaCBpcyB0byBhbGxvdyB0aGUgY29udGFpbmVyIHRvIGFjY2VwdCBhIHZhcmlhZGljIGFyZ3VtZW50IGxpc3QKZm9yIHRoZSBjb25zdHJ1Y3RvciBvZiBpdHMgY29udGFpbmVkIG9iamVjdC48YnI+ClRoZSBjb3JyZWN0IGZ1bmN0aW9uIG92ZXJsb2FkIG11c3QgYmUgYmFzZWQgb24gdGhlIG9ubHkgZGlzdGluY3RpdmUgYW5kIGNvbW1vbgpjaGFyYWN0ZXJpc3RpYyBvZiBhbGwgdGhlIGNsYXNzZXMgaW4gZWFjaCBmYW1pbHksIHRoZSBiYXNlIGNsYXNzLjxicj4KRGVwZW5kaW5nIG9uIHRoZSBjb250YWluZXIgY2xhc3MsIHlvdSBjYW4gdXNlICdlbmFibGVfaWYnIHRvIGdlbmVyYXRlIHRoZSByaWdodCBvdmVybG9hZCwgb3IgdXNlIHRoZSBmb2xsb3dpbmcKZGlzcGF0Y2ggdGVjaG5pcXVlICh1c2VkIGluIHRoZSBCb29zdC5PcHRpb25hbCBjbGFzcyk6CjwvcD4KPHByZT5zdHJ1Y3QgQwp7CiAgIEMoKSA6IGNvbnRhaW5lZF8oMCkge30KICAgQyAoIFggY29uc3QmIHYgKSA6IGNvbnRhaW5lZF8gKCBuZXcgWCh2KSApIHt9CgogICB0ZW1wbGF0ZSZsdDtjbGFzcyBFeHByJmd0CiAgIEMgKCBFeHByIGNvbnN0JiBleHByICkKICAgIDoKICAgIGNvbnRhaW5lZF8gKCB1bmluaXRpYWxpemVkX3N0b3JhZ2UoKSApCiAgIHsKICAgIGNvbnN0cnVjdChleHByLCZleHByKQogICB9CgogIH5DKCkgeyBkZWxldGUgY29udGFpbmVkXyA7IH0KCiAgdGVtcGxhdGUmbHQ7Y2xhc3MgSW5QbGFjZUZhY3RvcnkmZ3Q7CiAgdm9pZCBjb25zdHJ1Y3QgKCBJblBsYWNlRmFjdG9yeSBjb25zdCYgYUZhY3RvcnksIGJvb3N0Ojppbl9wbGFjZV9mYWN0b3J5X2Jhc2UqICkKICB7CiAgICBhRmFjdG9yeS50ZW1wbGF0ZSBhcHBseSZsdDtYJmd0Oyhjb250YWluZWRfKTsKICB9CgogIHRlbXBsYXRlJmx0O2NsYXNzIFR5cGVkSW5QbGFjZUZhY3RvcnkmZ3Q7CiAgdm9pZCBjb25zdHJ1Y3QgKCBUeXBlZEluUGxhY2VGYWN0b3J5IGNvbnN0JiBhRmFjdG9yeSwgYm9vc3Q6OnR5cGVkX2luX3BsYWNlX2ZhY3RvcnlfYmFzZSogKQogIHsKICAgIGFGYWN0b3J5LmFwcGx5KGNvbnRhaW5lZF8pOwogIH0KCiAgWCogdW5pbml0aWFsaXplZF9zdG9yYWdlKCkgeyByZXR1cm4gc3RhdGljX2Nhc3QmbHQ7WComZ3Q7KG5ldyBjaGFyW3NpemVvZihYKV0pIDsgfQoKICBYKiBjb250YWluZWRfIDsKfSA7CjwvcHJlPgoKPGhyPgoKPGgyPjxBIE5BTUU9InVzZXItdXNhZ2UiPlVzZXItc2lkZSBVc2FnZTwvYT48L2gyPgoKPHA+RW5kIHVzZXJzIHBhc3MgdG8gdGhlIGNvbnRhaW5lciBhbiBpbnN0YW5jZSBvZiBhIGZhY3Rvcnkgb2JqZWN0IGhvbGRpbmcgdGhlIGFjdHVhbCBwYXJhbWV0ZXJzIG5lZWRlZCB0byBjb25zdHJ1Y3QgdGhlCmNvbnRhaW5lZCBvYmplY3QgZGlyZWN0bHkgd2l0aGluIHRoZSBjb250YWluZXIuIEZvciB0aGlzLCB0aGUgaGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9uICdpbl9wbGFjZScgaXMgdXNlZC48YnI+ClRoZSBjYWxsICdpbl9wbGFjZShhMCxhMSxhMiwuLi4sYW4pJyBjb25zdHJ1Y3RzIGEgKG5vbi10eXBlZCkgJ2luX3BsYWNlX2ZhY3RvcnknIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50IGxpc3QuPGJyPgpUaGUgY2FsbCAnaW5fcGxhY2UmbHQ7VCZndDsoYTAsYTEsYTIsLi4uLGFuKScgY29uc3RydWN0cyBhICd0eXBlZF9pbl9wbGFjZV9mYWN0b3J5JyBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudCBsaXN0IGZvciB0aGUKdHlwZSAnVCcuPC9wPgo8cHJlPnZvaWQgZm9vKCkKewogIEMgYSggaW5fcGxhY2UoMTIzLCJoZWxsbyIpICkgOyAgICAvLyBpbl9wbGFjZV9mYWN0b3J5IHBhc3NlZAogIEMgYiggaW5fcGxhY2UmbHQ7WCZndDsoNDU2LCJ3b3JsZCIpICkgOyAvLyB0eXBlZF9pbl9wbGFjZV9mYWN0b3J5IHBhc3NlZAp9CjwvcHJlPgoKPFA+UmV2aXNlZCBTZXB0ZW1iZXIgMTcsIDIwMDQ8L1A+CjxwPqkgQ29weXJpZ2h0IEZlcm5hbmRvIEx1aXMgQ2FjY2lvbGEgQ2FyYmFsbGFsLCAyMDA0PC9wPgo8cD4gVXNlLCBtb2RpZmljYXRpb24sIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCkxpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIDxhIGhyZWY9Ii4uLy4uL0xJQ0VOU0VfMV8wLnR4dCI+CkxJQ0VOU0VfMV8wLnR4dDwvYT4gb3IgY29weSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPgp3d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT4pPC9wPgo8UD5EZXZlbG9wZWQgYnkgPEEgSFJFRj0ibWFpbHRvOmZlcm5hbmRvX2NhY2Npb2xhQGhvdG1haWwuY29tIj5GZXJuYW5kbyBDYWNjaW9sYTwvQT4sCnRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGF0IDxBCkhSRUY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnIj53d3cuYm9vc3Qub3JnPC9BPiwgYW5kIHRoZSBib29zdAo8QSBIUkVGPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9tb3JlL21haWxpbmdfbGlzdHMuaHRtI21haW4iPmRpc2N1c3Npb24gbGlzdHM8L0E+PC9QPgo8L0JPRFk+CjwvSFRNTD4K