LyoKICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAqCiAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwogKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgogKgogKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogKgogKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQogKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAqIHF1ZXN0aW9ucy4KICovCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBEaWFsb2cKLy8KCklERF9ET1dOTE9BRF9ESUFMT0cgRElBTE9HRVggMCwgMCwgMzQwLCAxMjAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTXzNETE9PSyB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgCiAgICBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiQ29tcG9uZW50aSBhZ2dpdW50aXZpIHJpY2hpZXN0aSIKRVhTVFlMRSBXU19FWF9BUFBXSU5ET1cKRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKQkVHSU4KICAgIExURVhUICAgICAgICAgICAiIiwgSURDX0RPV05MT0FEX01BU1RIRUFELCAwLCAwLCAzNDAsIDM5CiAgICBMVEVYVCAgICAgICAgICAgIiIsIElEQ19NQVNUSEVBRF9URVhULCA2MCwgNCwgMjIwLCAzMAogICAgQ09OVFJPTCAgICAgICAgICIiLCBJRENfU1RBVElDLCJTdGF0aWMiLCBTU19CTEFDS0ZSQU1FIHwgU1NfU1VOS0VOLAogICAgICAgICAgICAgICAgICAgIDAsIDM5LCAzNDAsIDEKICAgIExURVhUICAgICAgICAgICAiIiwgSURDX0RPV05MT0FEX1RFWFQsIDEyLCA2MCwgMzE2LCAyMAogICAgTFRFWFQgICAgICAgICAgICIiLCBJRENfVElNRV9SRU1BSU5JTkcsIDEyLCA5MCwgMzE2LCAxMAogICAgQ09OVFJPTCAgICAgICAgICJQcm9ncmVzczEiLDEwMDYsIm1zY3Rsc19wcm9ncmVzczMyIixQQlNfU01PT1RILAogICAgICAgICAgICAgICAgICAgIDEyLCAxMDAsIDI2NSwgMTQKICAgIFBVU0hCVVRUT04JICAgICJBbm51bGxhIiwgIDIsIDI4NSwgMTAwLCA0NiwgMTQKRU5ECi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIERFU0lHTklORk8KLy8KCiNpZmRlZiBBUFNUVURJT19JTlZPS0VECkdVSURFTElORVMgREVTSUdOSU5GTyBESVNDQVJEQUJMRSAKQkVHSU4KICAgIDEwNSwgRElBTE9HCiAgICBCRUdJTgogICAgICAgIExFRlRNQVJHSU4sIDcKICAgICAgICBSSUdIVE1BUkdJTiwgMjM2CiAgICAgICAgVE9QTUFSR0lOLCA3CiAgICAgICAgQk9UVE9NTUFSR0lOLCA2MwogICAgRU5ECkVORAojZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRAoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIFN0cmluZyBUYWJsZQovLwoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgCkJFR0lOCiAgICBJRFNfRE9XTkxPQURfQ0FOQ0VMX01FU1NBR0UgICAiU2Ugc2kgYW5udWxsYSBsJ2luc3RhbGxhemlvbmUgZGkgY29tcG9uZW50aSBhZ2dpdW50aXZpIG5lY2Vzc2FyaSBwZXIgbCdhcHBsaWNhemlvbmUsIHF1ZXN0J3VsdGltYSBwb3RyZWJiZSBjaGl1ZGVyc2kuXG5cbkFubnVsbGFyZSBsJ2luc3RhbGxhemlvbmUgZGkgY29tcG9uZW50aSBhZ2dpdW50aXZpPyIKICAgIElEU19ET1dOTE9BRF9DQU5DRUxfQ0FQVElPTiAgICJBbm51bGxhIC0gQ29tcG9uZW50aSBhZ2dpdW50aXZpIgogICAgSURTX0RPV05MT0FEX0NBTkNFTF9JTlNUUlVDVElPTiAgICIiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9SRVFVRVNUX1RJTUVPVVQgICAgICAiVGltZW91dCBkZWxsYSBjb25uZXNzaW9uZSIKICAgIElEU19IVFRQX0lOU1RSVUNUSU9OX1NFUlZFUl9OT1RfUkVBQ0hBQkxFICJJbXBvc3NpYmlsZSBzdGFiaWxpcmUgdW5hIGNvbm5lc3Npb25lIGEgSW50ZXJuZXQiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9VTktOT1dOX0VSUk9SICAgICAgICAiRXJyb3JlIGRlbCBzZXJ2ZXIgKGVycm9yZSAlcykiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9TRVJWSUNFX1VOQVZBSUwgICAgICAiU2Vydml6aW8gbm9uIGRpc3BvbmliaWxlIChlcnJvcmUgJXMpIgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fRk9SQklEREVOICAgICAgICAgICAgIkFjY2Vzc28gbmVnYXRvIG8gdmlldGF0byAoZXJyb3JlICVzKSIKICAgIElEU19IVFRQX1NUQVRVU19PVEhFUiAgICAgICAgICAgICAgICAgICAgICJFcnJvcmUgZHVyYW50ZSBsYSByaWNoaWVzdGEuIFByb3ZhcmUgYSByZWludmlhcmUgbGEgcmljaGllc3RhPyIKCi8vIEhUVFAgc3RhdHVzIGNvZGUKICAgIElEU19IVFRQX1NUQVRVU19SRVFVRVNUX1RJTUVPVVQgIlRlbXBvIHNjYWR1dG8gZGVsIHNlcnZlciBpbiBhdHRlc2EgZGVsbGEgcmljaGllc3RhLiIKICAgIElEU19IVFRQX1NUQVRVU19GT1JCSURERU4JCSJJbCBzZXJ2ZXIgaGEgcmljZXZ1dG8gbGEgcmljaGllc3RhIG1hIG5vbiBuZSBjb25zZW50ZSBsJ2VsYWJvcmF6aW9uZS4iCiAgICBJRFNfSFRUUF9TVEFUVVNfU0VSVkVSX0VSUk9SCSJJbCBzZXJ2ZXIgaGEgcmlsZXZhdG8gdW5hIGNvbmRpemlvbmUgaW1wcmV2aXN0YSBjaGUgaGEgaW1wZWRpdG8gZGkgc29kZGlzZmFyZSBsYSByaWNoaWVzdGEuIgogICAgSURTX0hUVFBfU1RBVFVTX1NFUlZJQ0VfVU5BVkFJTAkiSWwgc2Vydml6aW8g6CB0ZW1wb3JhbmVhbWVudGUgc292cmFjY2FyaWNvLiIKCgogICAgSURTX0RPV05MT0FEX1NUQVRVU19SRVRSWQkJIlNlcnZlciBvY2N1cGF0bywgcmlwcm92YXJlIHRyYSAlbGQgc2Vjb25kaS4uLiIKCiAgICBJRFNfRVJST1JfQ0FQVElPTiAgICAgICAgICAgICAgICJFcnJvcmUgLSBKYXZhIEtlcm5lbCIKICAgIElEU19IT1VSU01JTlVURVNFQ09ORAkgICAgIlRlbXBvIHJpbWFuZW50ZSBwcmV2aXN0bzogJWQgb3JlICVkIG1pbnV0aSAlLjBmIHNlY29uZGkiCiAgICBJRFNfSE9VUk1JTlVURVNFQ09ORAkgICAgIlRlbXBvIHJpbWFuZW50ZSBwcmV2aXN0bzogJWQgb3JhICVkIG1pbnV0aSAlLjBmIHNlY29uZGkiCiAgICBJRFNfTUlOVVRFU0VDT05EIAkJICAgICJUZW1wbyByaW1hbmVudGUgcHJldmlzdG86ICVkIG1pbnV0aSAlLjBmIHNlY29uZGkiCiAgICBJRFNfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICJUZW1wbyByaW1hbmVudGUgcHJldmlzdG86ICUuMGYgc2Vjb25kaSIKICAgIElEU19ESVNLX0ZVTExfRVJST1JfQ0FQVElPTiAgICAgIkRpc2NvIHBpZW5vIgogICAgSURTX0RJU0tfRlVMTF9FUlJPUiAgICAgICAgICAgICAiSmF2YSBLZXJuZWwgbm9uIGhhIGVmZmV0dHVhdG8gaWwgZG93bmxvYWQgZGVpIGNvbXBvbmVudGkgbmVjZXNzYXJpIHBlcmNow6kgaWwgZGlzY28gw6ggcGllbm8uICBSaXByb3ZhcmU/IgogICAgSURTX0RJU0tfV1JJVEVfRVJST1JfQ0FQVElPTiAgICAiRXJyb3JlIGRpIHNjcml0dHVyYSBzdWwgZGlzY28iCiAgICBJRFNfRElTS19XUklURV9FUlJPUiAgICAgICAgICAgICJKYXZhIEtlcm5lbCBoYSByaWxldmF0byB1biBlcnJvcmUgZHVyYW50ZSBsYSBzY3JpdHR1cmEgc3VsIGRpc2NvLiAgUmlwcm92YXJlPyIKICAgIElEU19IVFRQX1NUQVRVU19TRVJWRVJfTk9UX1JFQUNIQUJMRSAiTm9uIOggcG9zc2liaWxlIHV0aWxpenphcmUgSmF2YSBLZXJuZWwgY29uIGxlIGltcG9zdGF6aW9uaSBkaSBjb25uZXNzaW9uZSBJbnRlcm5ldCBhdHRpdmUgbmVsIHNpc3RlbWEuICBOZWwgUGFubmVsbG8gZGkgY29udHJvbGxvIGRpIFdpbmRvd3MsIHNlbGV6aW9uYXJlIE9wemlvbmkgSW50ZXJuZXQgLT4gQ29ubmVzc2lvbmkgcGVyIGNvbnRyb2xsYXJlIGNoZSBsZSBpbXBvc3RhemlvbmkgZSBsZSBpbmZvcm1hemlvbmkgc3VsIHByb3h5IHNpYW5vIGNvcnJldHRlLiIKCiAgICBJRFNfRE9XTkxPQURfUkVUUlkgICAgICAgICAgICAgIkVycm9yZSBkaSBkb3dubG9hZCIKICAgIElEU19ET1dOTE9BRF9SRVRSWV9URVhUICAgICAgICAiU2kg6CB2ZXJpZmljYXRvIHVuIGVycm9yZSBkdXJhbnRlIGlsIGRvd25sb2FkIGRpIGFsY3VuaSBjb21wb25lbnRpIHJpY2hpZXN0aS4gUml0ZW50YXJlIGlsIGRvd25sb2FkIGRpIHRhbGkgY29tcG9uZW50aT8iCgogICAgSURTX0RPV05MT0FEICAgICAgICAgICAgICAgICAgICJJbnN0YWxsYXppb25lIGRpIGNvbXBvbmVudGkgYWdnaXVudGl2aSBpbiBjb3JzbyIKCUlEU19ET1dOTE9BRF9VTlBBQ0tJTkcgICAgICAgICAiRGVjb21wcmVzc2lvbmUgZGVsIGJ1bmRsZSBpbiBjb3JzbyIKICAgIElEU19ET1dOTE9BRF9URVhUICAgICAgICAgICAgICAiTCdhcHBsaWNhemlvbmUgSmF2YSB2ZXJy4CBhdnZpYXRhIGRvcG8gaWwgZG93bmxvYWQgZSBsJ2luc3RhbGxhemlvbmUgZGVpIGNvbXBvbmVudGkgcmljaGllc3RpLiIKICAgIAogICAgSURTX0ZJTEVfVVBEQVRFX0VSUk9SICAgICAgICAgICJFcnJvcmUgZHVyYW50ZSBsJ2FnZ2lvcm5hbWVudG8gZGkgJXMlcy4iCiAgICBJRFNfRklMRV9ERUxFVEVfRVJST1IgICAgICAgICAgIkVycm9yZSBkdXJhbnRlIGxhIHJpbW96aW9uZSBkaSAlcy4iCiAgICBJRFNfSkFWQV9IT01FX0VSUk9SICAgICAgICAgICAgIkltcG9zc2liaWxlIGRldGVybWluYXJlIGxhIGRpcmVjdG9yeSBob21lIGRpIEphdmEuIgogICAgSURTX0tFUk5FTF9IT01FX0VSUk9SICAgICAgICAgICJJbXBvc3NpYmlsZSBkZXRlcm1pbmFyZSBpbCBwZXJjb3JzbyBkaSBqa2VybmVsLmRsbC4iCiAgICBJRFNfSkJST0tFUl9FUlJPUiAgICAgICAgICAgICAgIkltcG9zc2liaWxlIGF2dmlhcmUgamJyb2tlci5leGUuIgogICAgSURTX0ZBVEFMX0VSUk9SICAgICAgICAgICAgICAgICJKYXZhIG5vbiDoIGluIGdyYWRvIGRpIHNjYXJpY2FyZSBpIGNvbXBvbmVudGkgbmVjZXNzYXJpLiBJbCBwcm9ncmFtbWEgdmVycuAgdGVybWluYXRvLiIKICAgIElEU19FUlJPUl9ET1dOTE9BRElOR19CVU5ETEVfUFJPUEVSVElFUyAiSmF2YSBub24g6CBpbiBncmFkbyBkaSBjb211bmljYXJlIGNvbiBpbCBzZXJ2ZXIgZGkgZG93bmxvYWQuIElsIHByb2dyYW1tYSB2ZXJy4CB0ZXJtaW5hdG8uIgogICAgSURTX0VSUk9SX01BTEZPUk1FRF9CVU5ETEVfUFJPUEVSVElFUyAiSmF2YSBoYSByaWxldmF0byB1biBlcnJvcmUgZHVyYW50ZSBsYSBjb211bmljYXppb25lIGNvbiBpbCBzZXJ2ZXIgZGkgZG93bmxvYWQuIElsIHByb2dyYW1tYSB2ZXJy4CB0ZXJtaW5hdG8uIgogICAgSURTX0VSUk9SX01BTEZPUk1FRF9VUkwgIkphdmEgbm9uIOggaW4gZ3JhZG8gZGkgZXNlZ3VpcmUgaWwgZG93bmxvYWQgZGFsbCdVUkwgJyVzJy4gSWwgcHJvZ3JhbW1hIHZlcnLgIHRlcm1pbmF0by4iCkVORAo=