LyoKICogQ29weXJpZ2h0IDIwMDQsIDIwMDcgSm9z6SBNYW51ZWwgRmVycmVyIE9ydGl6CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfU1BBTklTSCwgU1VCTEFOR19ORVVUUkFMCgpVSUlOU0VSVE9CSkVDVCBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDI5NCwgMTUxClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkluc2VydGFyIG9iamV0byIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTElTVEJPWCAgICAgICAgIElEQ19PQkpUWVBFTElTVCw4MiwxOSwxMzEsNjYsTEJTX1NPUlQgfAogICAgICAgICAgICAgICAgICAgIExCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVklTSUJMRSB8IFdTX1ZTQ1JPTEwgfAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AKICAgIExURVhUICAgICAgICAgICAiVGlwbyBkZSBvYmpldG86IixJRENfT0JKVFlQRUxCTCw4Miw3LDUzLDgsV1NfVklTSUJMRQogICAgREVGUFVTSEJVVFRPTiAgICJBY2VwdGFyIixJRE9LLDIyMSw3LDY2LDE0CiAgICBQVVNIQlVUVE9OICAgICAgIkNhbmNlbGFyIixJRENBTkNFTCwyMjEsMjQsNjYsMTQKICAgIEdST1VQQk9YICAgICAgICAiUmVzdWx0YWRvIixJRENfUkVTVUxULDcsMTAzLDIwOCw0MQogICAgQ09OVFJPTCAgICAgICAgICJDcmVhciBudWV2byIsSURDX0NSRUFURU5FVywiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04gfCAKICAgICAgICAgICAgICAgICAgICBXU19HUk9VUCw3LDIwLDYyLDEwCiAgICBDT05UUk9MICAgICAgICAgIkNyZWFyIGNvbnRyb2wiLElEQ19DUkVBVEVDT05UUk9MLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiB8IE5PVCBXU19WSVNJQkxFLDcsNTQsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAiQ3JlYXIgZGVzZGUgYXJjaGl2byIsSURDX0NSRUFURUZST01GSUxFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiw3LDM3LDY3LDEwCiAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX1JFU1VMVERFU0MsNDksMTEyLDE1OSwyMwogICAgUFVTSEJVVFRPTiAgICAgICImQfFhZGlyIGNvbnRyb2wuLi4iLElEQ19BRERDT05UUk9MLDgxLDg4LDYzLDE0LE5PVCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICAgIk1vc3RyYXIgY29tbyBpY29ubyIsSURDX0FTSUNPTiwiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QIHwgTk9UIFdTX1ZJU0lCTEUsMjIzLDU4LDY0LDEwCiAgICBQVVNIQlVUVE9OICAgICAgIkV4cGxvcmFyLi4uIixJRENfQlJPV1NFLDgzLDUzLDUwLDE0LE5PVCBXU19WSVNJQkxFCiAgICBMVEVYVCAgICAgICAgICAgIkFyY2hpdm86IixJRENfRklMRUxCTCw4MywyNywyMCw4LCBOT1QgV1NfVklTSUJMRQogICAgRURJVFRFWFQgICAgICAgIElEQ19GSUxFLDgzLDM3LDEzMiwxMyxFU19BVVRPSFNDUk9MTCB8IE5PVCBXU19WSVNJQkxFCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogIElEU19SRVNVTFRPQkpERVNDCSJJbnNlcnRhIHVuIG51ZXZvIG9iamV0byAlcyBlbiBzdSBkb2N1bWVudG8iCiAgSURTX1JFU1VMVEZJTEVPQkpERVNDCSJJbnNlcnRhIGVsIGNvbnRlbmlkbyBkZWwgYXJjaGl2byBjb21vIHVuIG9iamV0byBlbiBzdSBkb2N1bWVudG8sIGNvbiBsbyBxdWUgcG9kcuEgYWN0aXZhcmxvIHV0aWxpemFuZG8gZWwgcHJvZ3JhbWEgcXVlIGxvIGNyZfMuIgogIElEU19CUk9XU0UgICAgICAgICAgICAiRXhwbG9yYXIiCiAgSURTX05PVE9MRU1PRCAgICAgICAgICJFbCBhcmNoaXZvIG5vIHBhcmVjZSBzZXIgdW4gbfNkdWxvIE9MRSB24WxpZG8uIEluY2FwYXogZGUgcmVnaXN0cmFyIGVsIGNvbnRyb2wgT0xFLiIKICBJRFNfTk9UT0xFTU9EQ0FQVElPTiAgIkHxYWRpciBjb250cm9sIgp9CgpJRERfUEFTVEVTUEVDSUFMNCBESUFMT0cgRElTQ0FSREFCTEUgMywgMTUsIDI5MywgMTQwClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19TRVRGT05UIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJQZWdhZG8gZXNwZWNpYWwiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExURVhUICAgICAgICAgIk9yaWdlbjoiLCAtMSwgNiwgOSwgMzAsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgQ09OVFJPTCAgICAgICAiJlBlZ2FyIiwgSURDX1BTX1BBU1RFLCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgNiwgMzgsIDU1LCAxMAogICAgQ09OVFJPTCAgICAgICAiUGVnYXIgJmVubGFjZSIsIElEQ19QU19QQVNURUxJTkssICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCA2MywgNTUsIDEwCiAgICBMVEVYVCAgICAgICAgICImQ29tbzoiLCAtMSwgNjUsIDI1LCAxNiwgOCwgV1NfVklTSUJMRSB8IFdTX0dST1VQCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19QQVNURUxJU1QsICAgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgTk9UIFdTX1ZJU0lCTEUKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElOS0xJU1QsIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfRElTUExBWUxJU1QsICAgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUKICAgIENPTlRST0wgICAgICAgIkFjZXB0YXIiLCBJRE9LLCAiQnV0dG9uIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICJDYW5jZWxhciIsIElEQ0FOQ0VMLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDIzLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIkEmeXVkYSIsIElEQ19PTEVVSUhFTFAsICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNDIsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiJk1vc3RyYXIgY29tbyBpY29ubyIsIElEQ19QU19ESVNQTEFZQVNJQ09OLCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNTksIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX0lDT05ESVNQTEFZLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDIyNCwgNzUsIDY2LCA0NAogICAgQ09OVFJPTCAgICAgICAiQ2FtYmlhciAmaWNvbm8uLi4iLCBJRENfUFNfQ0hBTkdFSUNPTiwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAxMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1JFU1VMVElNQUdFLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDgsIDEwMSwgNDIsIDM0CiAgICBDT05UUk9MICAgICAgICI8PCBlbCB0ZXh0byBkZWwgcmVzdWx0YWRvIHZhIGFxde0gPj4iLCBJRENfUFNfUkVTVUxUVEVYVCwgIlN0YXRpYyIsIFNTX05PUFJFRklYIHwgV1NfVklTSUJMRSwgNTQsIDEwMCwgMTU5LCAzNQogICAgQ09OVFJPTCAgICAgICAiUmVzdWx0YWRvIiwgLTEsICJCdXR0b24iLCBCU19HUk9VUEJPWCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwgNiwgOTAsIDIxMiwgNDgKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19TT1VSQ0VURVhULCAiRWRpdCIsIEVTX1JFQURPTkxZIHwgRVNfQVVUT0hTQ1JPTEwgfCBXU19WSVNJQkxFLCAzNywgOSwgMTgwLCA4CkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURTX1BTX1BBU1RFX0RBVEEgICAgICAgICAgICAgICAgICAgICAiSW5zZXJ0YSBlbCBjb250ZW5pZG8gZGVsIHBvcnRhcGFwZWxlcyBlbiBzdSBkb2N1bWVudG8gY29tbyAlcy4iCiAgICBJRFNfUFNfUEFTVEVfT0JKRUNUICAgICAgICAgICAgICAgICAgICJJbnNlcnRhIGVsIGNvbnRlbmlkbyBkZWwgcG9ydGFwYXBlbGVzIGVuIHN1IGRvY3VtZW50byBkZSBtb2RvIHF1ZSBwdWVkYSBhY3RpdmFybG8gdXNhbmRvICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1RfQVNfSUNPTiAgICAgICAgICAgIkluc2VydGEgZWwgY29udGVuaWRvIGRlbCBwb3J0YXBhcGVsZXMgZW4gc3UgZG9jdW1lbnRvIGRlIG1vZG8gcXVlIHB1ZWRhIGFjdGl2YXJsbyB1c2FuZG8gJXMuICBTZXLhIG1vc3RyYWRvIGNvbW8gdW4gaWNvbm8uIgogICAgSURTX1BTX1BBU1RFX0xJTktfREFUQSAgICAgICAgICAgICAgICAiSW5zZXJ0YSBlbCBjb250ZW5pZG8gZGVsIHBvcnRhcGFwZWxlcyBlbiBzdSBkb2N1bWVudG8gY29tbyAlcy4gIExvcyBkYXRvcyBlc3RhcuFuIGVubGF6YWRvcyBhbCBhcmNoaXZvIGRlIG9yaWdlbiwgcG9yIGxvIHF1ZSBsb3MgY2FtYmlvcyBlbiBlbCBhcmNoaXZvIHNlIHJlZmxlamFy4W4gZW4gc3UgZG9jdW1lbnRvLiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVCAgICAgICAgICAgICAgIkluc2VydGEgdW5hIGltYWdlbiBkZWwgY29udGVuaWRvIGRlbCBwb3J0YXBhcGVsZXMgZW4gc3UgZG9jdW1lbnRvLiAgTGEgaW1hZ2VuIGVzdGFy4SBlbmxhemFkYSBhbCBhcmNoaXZvIGRlIG9yaWdlbiwgcG9yIGxvIHF1ZSBsb3MgY2FtYmlvcyBlbiBlbCBhcmNoaXZvIHNlIHJlZmxlamFy4W4gZW4gc3UgZG9jdW1lbnRvLiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVF9BU19JQ09OICAgICAgIkluc2VydGEgdW4gYWNjZXNvIGRpcmVjdG8gcXVlIGFwdW50ZSBhIGxhIGxvY2FsaXphY2nzbiBkZWwgY29udGVuaWRvIGRlbCBwb3J0YXBhcGVsZXMuICBFbCBhY2Nlc28gZGlyZWN0byBlc3RhcuEgZW5sYXphZG8gYWwgYXJjaGl2byBkZSBvcmlnZW4sIHBvciBsbyBxdWUgbG9zIGNhbWJpb3MgZW4gZWwgYXJjaGl2byBzZSByZWZsZWphcuFuIGVuIHN1IGRvY3VtZW50by4iCiAgICBJRFNfUFNfTk9OX09MRSAgICAgICAgICAgICAgICAgICAgICAgICJJbnNlcnRhIGVsIGNvbnRlbmlkbyBkZWwgcG9ydGFwYXBlbGVzIGVuIHN1IGRvY3VtZW50by4iCiAgICBJRFNfUFNfVU5LTk9XTl9UWVBFICAgICAgICAgICAgICAgICAgICJUaXBvIGRlc2Nvbm9jaWRvIgogICAgSURTX1BTX1VOS05PV05fU1JDICAgICAgICAgICAgICAgICAgICAiT3JpZ2VuIGRlc2Nvbm9jaWRvIgogICAgSURTX1BTX1VOS05PV05fQVBQICAgICAgICAgICAgICAgICAgICAiZWwgcHJvZ3JhbWEgcXVlIGxvIGNyZfMiCn0K