LyoKICogQ29weXJpZ2h0IDIwMDcgRGFuaWVsIE55bGFuZGVyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMCgpVSUlOU0VSVE9CSkVDVCBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDI5NCwgMTUxClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkluZm9nYSBvYmpla3QiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBJRENfT0JKVFlQRUxJU1QsODIsMTksMTMxLDY2LExCU19TT1JUIHwKICAgICAgICAgICAgICAgICAgICBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMIHwKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QCiAgICBMVEVYVCAgICAgICAgICAgIk9iamVrdHR5cDoiLElEQ19PQkpUWVBFTEJMLDgyLDcsNTMsOCxXU19WSVNJQkxFCiAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDIyMSw3LDY2LDE0CiAgICBQVVNIQlVUVE9OICAgICAgIkF2YnJ5dCIsSURDQU5DRUwsMjIxLDI0LDY2LDE0CiAgICBHUk9VUEJPWCAgICAgICAgIlJlc3VsdGF0IixJRENfUkVTVUxULDcsMTAzLDIwOCw0MQogICAgQ09OVFJPTCAgICAgICAgICJTa2FwYSBueSIsSURDX0NSRUFURU5FVywiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04gfAogICAgICAgICAgICAgICAgICAgIFdTX0dST1VQLDcsMjAsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAiQ3JlYXRlIENvbnRyb2wiLElEQ19DUkVBVEVDT05UUk9MLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiB8IE5PVCBXU19WSVNJQkxFLDcsNTQsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAiU2thcGEgZnLlbiBmaWwiLElEQ19DUkVBVEVGUk9NRklMRSwiQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04sNywzNyw2NywxMAogICAgTFRFWFQgICAgICAgICAgICIiLElEQ19SRVNVTFRERVNDLDQ5LDExMiwxNTksMjMKICAgIFBVU0hCVVRUT04gICAgICAiJkFkZCBDb250cm9sLi4uIixJRENfQUREQ09OVFJPTCw4MSw4OCw2MywxNCxOT1QgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAgICJWaXNhIHNvbSBpa29uIixJRENfQVNJQ09OLCJCdXR0b24iLEJTX0FVVE9DSEVDS0JPWCB8CiAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUCB8IE5PVCBXU19WSVNJQkxFLDIyMyw1OCw2NCwxMAogICAgUFVTSEJVVFRPTiAgICAgICJCbORkZHJhLi4uIixJRENfQlJPV1NFLDgzLDUzLDUwLDE0LE5PVCBXU19WSVNJQkxFCiAgICBMVEVYVCAgICAgICAgICAgIkZpbDoiLElEQ19GSUxFTEJMLDgzLDI3LDIwLDgsIE5PVCBXU19WSVNJQkxFCiAgICBFRElUVEVYVCAgICAgICAgSURDX0ZJTEUsODMsMzcsMTMyLDEzLEVTX0FVVE9IU0NST0xMIHwgTk9UIFdTX1ZJU0lCTEUKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgSURTX1JFU1VMVE9CSkRFU0MJIkluZm9nYSBldHQgbnl0dCAlcy1vYmpla3QgaSBkaXR0IGRva3VtZW50IgogIElEU19SRVNVTFRGSUxFT0JKREVTQwkiSW5zZXJ0IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcyBhbiBvYmplY3QgaW50byB5b3VyIGRvY3VtZW50IHNvIHRoYXQgeW91IG1heSBhY3RpdmF0ZSBpdCB1c2luZyB0aGUgcHJvZ3JhbSB3aGljaCBjcmVhdGVkIGl0LiIKICBJRFNfQlJPV1NFICAgICAgICAgICAgIkJs5GRkcmEiCiAgSURTX05PVE9MRU1PRCAgICAgICAgICJGaWxlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIE9MRSBtb2R1bGUuIFVuYWJsZSB0byByZWdpc3RlciBPTEUgY29udHJvbC4iCiAgSURTX05PVE9MRU1PRENBUFRJT04gICJBZGQgQ29udHJvbCIKfQoKSUREX1BBU1RFU1BFQ0lBTDQgRElBTE9HIERJU0NBUkRBQkxFIDMsIDE1LCAyOTMsIDE0MApTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfU0VURk9OVCB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiUGFzdGUgU3BlY2lhbCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTFRFWFQgICAgICAgICAiS+RsbGE6IiwgLTEsIDYsIDksIDMwLCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIENPTlRST0wgICAgICAgIktsaXN0cmEgJmluIiwgSURDX1BTX1BBU1RFLCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgNiwgMzgsIDU1LCAxMAogICAgQ09OVFJPTCAgICAgICAiS2xpc3RyYSBpbiAmbORuayIsIElEQ19QU19QQVNURUxJTkssICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCA2MywgNTUsIDEwCiAgICBMVEVYVCAgICAgICAgICImU29tOiIsIC0xLCA2NSwgMjUsIDE2LCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElTVCwgICAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSU5LTElTVCwgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19ESVNQTEFZTElTVCwgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAiT0siLCBJRE9LLCAiQnV0dG9uIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICJBdmJyeXQiLCBJRENBTkNFTCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICImSGrkbHAiLCBJRENfT0xFVUlIRUxQLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDQyLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiZWaXNhIHNvbSBpa29uIiwgSURDX1BTX0RJU1BMQVlBU0lDT04sICJCdXR0b24iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCA1OSwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfSUNPTkRJU1BMQVksICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgMjI0LCA3NSwgNjYsIDQ0CiAgICBDT05UUk9MICAgICAgICJCeXQgJmlrb24uLi4iLCBJRENfUFNfQ0hBTkdFSUNPTiwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAxMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1JFU1VMVElNQUdFLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDgsIDEwMSwgNDIsIDM0CiAgICBDT05UUk9MICAgICAgICI8PCByZXN1bHQgdGV4dCBnb2VzIGhlcmUgPj4iLCBJRENfUFNfUkVTVUxUVEVYVCwgIlN0YXRpYyIsIFNTX05PUFJFRklYIHwgV1NfVklTSUJMRSwgNTQsIDEwMCwgMTU5LCAzNQogICAgQ09OVFJPTCAgICAgICAiUmVzdWx0YXQiLCAtMSwgIkJ1dHRvbiIsIEJTX0dST1VQQk9YIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCA2LCA5MCwgMjEyLCA0OAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1NPVVJDRVRFWFQsICJFZGl0IiwgRVNfUkVBRE9OTFkgfCBFU19BVVRPSFNDUk9MTCB8IFdTX1ZJU0lCTEUsIDM3LCA5LCAxODAsIDgKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfUFNfUEFTVEVfREFUQSAgICAgICAgICAgICAgICAgICAgICJJbnNlcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIGludG8geW91ciBkb2N1bWVudCBhcyAlcy4iCiAgICBJRFNfUFNfUEFTVEVfT0JKRUNUICAgICAgICAgICAgICAgICAgICJJbnNlcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIGludG8geW91ciBkb2N1bWVudCBzbyB0aGF0IHlvdSBjYW4gYWN0aXZhdGUgaXQgdXNpbmcgJXMuIgogICAgSURTX1BTX1BBU1RFX09CSkVDVF9BU19JQ09OICAgICAgICAgICAiSW5zZXJ0cyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCBpbnRvIHlvdXIgZG9jdW1lbnQgc28gdGhhdCB5b3UgY2FuIGFjdGl2YXRlIGl0IHVzaW5nICVzLiAgSXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYW4gaWNvbi4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19EQVRBICAgICAgICAgICAgICAgICJJbnNlcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIGludG8geW91ciBkb2N1bWVudCBhcyAlcy4gIFRoZSBkYXRhIGlzIGxpbmtlZCB0byB0aGUgc291cmNlIGZpbGUgc28gdGhhdCBjaGFuZ2VzIHRvIHRoZSBmaWxlIHdpbGwgYmUgcmVmbGVjdGVkIGluIHlvdXIgZG9jdW1lbnQuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUICAgICAgICAgICAgICAiSW5zZXJ0cyBhIHBpY3R1cmUgb2YgdGhlIGNsaXBib2FyZCBjb250ZW50cyBpbnRvIHlvdXIgZG9jdW1lbnQuICBUaGUgcGljdHVyZSBpcyBsaW5rZWQgdG8gdGhlIHNvdXJjZSBmaWxlIHNvIHRoYXQgY2hhbmdlcyB0byB0aGUgZmlsZSB3aWxsIGJlIHJlZmxlY3RlZCBpbiB5b3VyIGRvY3VtZW50LiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVF9BU19JQ09OICAgICAgIkluc2VydHMgYSBzaG9ydGN1dCB3aGljaCBwb2ludHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjbGlwYm9hcmQgY29udGVudHMuICBUaGUgc2hvcnRjdXQgaXMgbGlua2VkIHRvIHRoZSBzb3VyY2UgZmlsZSBzbyB0aGF0IGNoYW5nZXMgdG8gdGhlIGZpbGUgd2lsbCBiZSByZWZsZWN0ZWQgaW4geW91ciBkb2N1bWVudC4iCiAgICBJRFNfUFNfTk9OX09MRSAgICAgICAgICAgICAgICAgICAgICAgICJJbnNlcnRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIGludG8geW91ciBkb2N1bWVudC4iCiAgICBJRFNfUFNfVU5LTk9XTl9UWVBFICAgICAgICAgICAgICAgICAgICJVbmtub3duIFR5cGUiCiAgICBJRFNfUFNfVU5LTk9XTl9TUkMgICAgICAgICAgICAgICAgICAgICJVbmtub3duIFNvdXJjZSIKICAgIElEU19QU19VTktOT1dOX0FQUCAgICAgICAgICAgICAgICAgICAgInRoZSBwcm9ncmFtIHdoaWNoIGNyZWF0ZWQgaXQiCn0K