LyoKICogQ29weXJpZ2h0IDIwMDQsIDIwMDcgSm9z6SBNYW51ZWwgRmVycmVyIE9ydGl6CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJyZXNvdXJjZS5oIgoKTEFOR1VBR0UgTEFOR19TUEFOSVNILCBTVUJMQU5HX05FVVRSQUwKClVJSU5TRVJUT0JKRUNUIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjk0LCAxNTEKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiSW5zZXJ0YXIgb2JqZXRvIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBMSVNUQk9YICAgICAgICAgSURDX09CSlRZUEVMSVNULDgyLDE5LDEzMSw2NixMQlNfU09SVCB8CiAgICAgICAgICAgICAgICAgICAgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WSVNJQkxFIHwgV1NfVlNDUk9MTCB8CiAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUAogICAgTFRFWFQgICAgICAgICAgICJUaXBvIGRlIG9iamV0bzoiLElEQ19PQkpUWVBFTEJMLDgyLDcsNTMsOCxXU19WSVNJQkxFCiAgICBERUZQVVNIQlVUVE9OICAgIkFjZXB0YXIiLElET0ssMjIxLDcsNjYsMTQKICAgIFBVU0hCVVRUT04gICAgICAiQ2FuY2VsYXIiLElEQ0FOQ0VMLDIyMSwyNCw2NiwxNAogICAgR1JPVVBCT1ggICAgICAgICJSZXN1bHRhZG8iLElEQ19SRVNVTFQsNywxMDMsMjA4LDQxCiAgICBDT05UUk9MICAgICAgICAgIkNyZWFyIG51ZXZvIixJRENfQ1JFQVRFTkVXLCJCdXR0b24iLEJTX0FVVE9SQURJT0JVVFRPTiB8IAogICAgICAgICAgICAgICAgICAgIFdTX0dST1VQLDcsMjAsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAiQ3JlYXIgY29udHJvbCIsSURDX0NSRUFURUNPTlRST0wsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgTk9UIFdTX1ZJU0lCTEUsNyw1NCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJDcmVhciBkZXNkZSBhcmNoaXZvIixJRENfQ1JFQVRFRlJPTUZJTEUsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OLDcsMzcsNjcsMTAKICAgIExURVhUICAgICAgICAgICAiIixJRENfUkVTVUxUREVTQyw0OSwxMTIsMTU5LDIzCiAgICBQVVNIQlVUVE9OICAgICAgIiZB8WFkaXIgY29udHJvbC4uLiIsSURDX0FERENPTlRST0wsODEsODgsNjMsMTQsTk9UIFdTX1ZJU0lCTEUKICAgIENPTlRST0wgICAgICAgICAiTW9zdHJhciBjb21vIGljb25vIixJRENfQVNJQ09OLCJCdXR0b24iLEJTX0FVVE9DSEVDS0JPWCB8IAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AgfCBOT1QgV1NfVklTSUJMRSwyMjMsNTgsNjQsMTAKICAgIFBVU0hCVVRUT04gICAgICAiRXhwbG9yYXIuLi4iLElEQ19CUk9XU0UsODMsNTMsNTAsMTQsTk9UIFdTX1ZJU0lCTEUKICAgIExURVhUICAgICAgICAgICAiQXJjaGl2bzoiLElEQ19GSUxFTEJMLDgzLDI3LDIwLDgsIE5PVCBXU19WSVNJQkxFCiAgICBFRElUVEVYVCAgICAgICAgSURDX0ZJTEUsODMsMzcsMTMyLDEzLEVTX0FVVE9IU0NST0xMIHwgTk9UIFdTX1ZJU0lCTEUKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgSURTX1JFU1VMVE9CSkRFU0MJIkluc2VydGEgdW4gbnVldm8gb2JqZXRvICVzIGVuIHN1IGRvY3VtZW50byIKICBJRFNfUkVTVUxURklMRU9CSkRFU0MJIkluc2VydGEgZWwgY29udGVuaWRvIGRlbCBhcmNoaXZvIGNvbW8gdW4gb2JqZXRvIGVuIHN1IGRvY3VtZW50bywgY29uIGxvIHF1ZSBwb2Ry4SBhY3RpdmFybG8gdXRpbGl6YW5kbyBlbCBwcm9ncmFtYSBxdWUgbG8gY3Jl8y4iCiAgSURTX0JST1dTRSAgICAgICAgICAgICJFeHBsb3JhciIKICBJRFNfTk9UT0xFTU9EICAgICAgICAgIkVsIGFyY2hpdm8gbm8gcGFyZWNlIHNlciB1biBt82R1bG8gT0xFIHbhbGlkby4gSW5jYXBheiBkZSByZWdpc3RyYXIgZWwgY29udHJvbCBPTEUuIgogIElEU19OT1RPTEVNT0RDQVBUSU9OICAiQfFhZGlyIGNvbnRyb2wiCn0KCklERF9QQVNURVNQRUNJQUw0IERJQUxPRyBESVNDQVJEQUJMRSAzLCAxNSwgMjkzLCAxNDAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIlBlZ2FkbyBlc3BlY2lhbCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTFRFWFQgICAgICAgICAiT3JpZ2VuOiIsIC0xLCA2LCA5LCAzMCwgOCwgV1NfVklTSUJMRSB8IFdTX0dST1VQCiAgICBDT05UUk9MICAgICAgICImUGVnYXIiLCBJRENfUFNfUEFTVEUsICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCAzOCwgNTUsIDEwCiAgICBDT05UUk9MICAgICAgICJQZWdhciAmZW5sYWNlIiwgSURDX1BTX1BBU1RFTElOSywgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDYsIDYzLCA1NSwgMTAKICAgIExURVhUICAgICAgICAgIiZDb21vOiIsIC0xLCA2NSwgMjUsIDE2LCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElTVCwgICAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSU5LTElTVCwgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19ESVNQTEFZTElTVCwgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAiQWNlcHRhciIsIElET0ssICJCdXR0b24iLCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwgMjI0LCA2LCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIkNhbmNlbGFyIiwgSURDQU5DRUwsICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiQSZ5dWRhIiwgSURDX09MRVVJSEVMUCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCA0MiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICImTW9zdHJhciBjb21vIGljb25vIiwgSURDX1BTX0RJU1BMQVlBU0lDT04sICJCdXR0b24iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCA1OSwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfSUNPTkRJU1BMQVksICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgMjI0LCA3NSwgNjYsIDQ0CiAgICBDT05UUk9MICAgICAgICJDYW1iaWFyICZpY29uby4uLiIsIElEQ19QU19DSEFOR0VJQ09OLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDEyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfUkVTVUxUSU1BR0UsICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgOCwgMTAxLCA0MiwgMzQKICAgIENPTlRST0wgICAgICAgIjw8IGVsIHRleHRvIGRlbCByZXN1bHRhZG8gdmEgYXF17SA+PiIsIElEQ19QU19SRVNVTFRURVhULCAiU3RhdGljIiwgU1NfTk9QUkVGSVggfCBXU19WSVNJQkxFLCA1NCwgMTAwLCAxNTksIDM1CiAgICBDT05UUk9MICAgICAgICJSZXN1bHRhZG8iLCAtMSwgIkJ1dHRvbiIsIEJTX0dST1VQQk9YIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCA2LCA5MCwgMjEyLCA0OAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1NPVVJDRVRFWFQsICJFZGl0IiwgRVNfUkVBRE9OTFkgfCBFU19BVVRPSFNDUk9MTCB8IFdTX1ZJU0lCTEUsIDM3LCA5LCAxODAsIDgKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfUFNfUEFTVEVfREFUQSAgICAgICAgICAgICAgICAgICAgICJJbnNlcnRhIGVsIGNvbnRlbmlkbyBkZWwgcG9ydGFwYXBlbGVzIGVuIHN1IGRvY3VtZW50byBjb21vICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIkluc2VydGEgZWwgY29udGVuaWRvIGRlbCBwb3J0YXBhcGVsZXMgZW4gc3UgZG9jdW1lbnRvIGRlIG1vZG8gcXVlIHB1ZWRhIGFjdGl2YXJsbyB1c2FuZG8gJXMuIgogICAgSURTX1BTX1BBU1RFX09CSkVDVF9BU19JQ09OICAgICAgICAgICAiSW5zZXJ0YSBlbCBjb250ZW5pZG8gZGVsIHBvcnRhcGFwZWxlcyBlbiBzdSBkb2N1bWVudG8gZGUgbW9kbyBxdWUgcHVlZGEgYWN0aXZhcmxvIHVzYW5kbyAlcy4gIFNlcuEgbW9zdHJhZG8gY29tbyB1biBpY29uby4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19EQVRBICAgICAgICAgICAgICAgICJJbnNlcnRhIGVsIGNvbnRlbmlkbyBkZWwgcG9ydGFwYXBlbGVzIGVuIHN1IGRvY3VtZW50byBjb21vICVzLiAgTG9zIGRhdG9zIGVzdGFy4W4gZW5sYXphZG9zIGFsIGFyY2hpdm8gZGUgb3JpZ2VuLCBwb3IgbG8gcXVlIGxvcyBjYW1iaW9zIGVuIGVsIGFyY2hpdm8gc2UgcmVmbGVqYXLhbiBlbiBzdSBkb2N1bWVudG8uIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUICAgICAgICAgICAgICAiSW5zZXJ0YSB1bmEgaW1hZ2VuIGRlbCBjb250ZW5pZG8gZGVsIHBvcnRhcGFwZWxlcyBlbiBzdSBkb2N1bWVudG8uICBMYSBpbWFnZW4gZXN0YXLhIGVubGF6YWRhIGFsIGFyY2hpdm8gZGUgb3JpZ2VuLCBwb3IgbG8gcXVlIGxvcyBjYW1iaW9zIGVuIGVsIGFyY2hpdm8gc2UgcmVmbGVqYXLhbiBlbiBzdSBkb2N1bWVudG8uIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUX0FTX0lDT04gICAgICAiSW5zZXJ0YSB1biBhY2Nlc28gZGlyZWN0byBxdWUgYXB1bnRlIGEgbGEgbG9jYWxpemFjafNuIGRlbCBjb250ZW5pZG8gZGVsIHBvcnRhcGFwZWxlcy4gIEVsIGFjY2VzbyBkaXJlY3RvIGVzdGFy4SBlbmxhemFkbyBhbCBhcmNoaXZvIGRlIG9yaWdlbiwgcG9yIGxvIHF1ZSBsb3MgY2FtYmlvcyBlbiBlbCBhcmNoaXZvIHNlIHJlZmxlamFy4W4gZW4gc3UgZG9jdW1lbnRvLiIKICAgIElEU19QU19OT05fT0xFICAgICAgICAgICAgICAgICAgICAgICAgIkluc2VydGEgZWwgY29udGVuaWRvIGRlbCBwb3J0YXBhcGVsZXMgZW4gc3UgZG9jdW1lbnRvLiIKICAgIElEU19QU19VTktOT1dOX1RZUEUgICAgICAgICAgICAgICAgICAgIlRpcG8gZGVzY29ub2NpZG8iCiAgICBJRFNfUFNfVU5LTk9XTl9TUkMgICAgICAgICAgICAgICAgICAgICJPcmlnZW4gZGVzY29ub2NpZG8iCiAgICBJRFNfUFNfVU5LTk9XTl9BUFAgICAgICAgICAgICAgICAgICAgICJlbCBwcm9ncmFtYSBxdWUgbG8gY3Jl8yIKfQo=