LyoKICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAqCiAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwogKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgogKgogKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogKgogKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQogKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAqIHF1ZXN0aW9ucy4KICovCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBEaWFsb2cKLy8KCklERF9ET1dOTE9BRF9ESUFMT0cgRElBTE9HRVggMCwgMCwgMzQwLCAxMjAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTXzNETE9PSyB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgCiAgICBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAikseJwYNSg5ODfIFbg2yDk4NngqqVS5d2IgpFWFNUWUxFIFdTX0VYX0FQUFdJTkRPVwpGT05UIDEwLCAiTVMgVUkgR290aGljIgpCRUdJTgogICAgTFRFWFQgICAgICAgICAgICIiLCBJRENfRE9XTkxPQURfTUFTVEhFQUQsIDAsIDAsIDM0MCwgMzkKICAgIExURVhUICAgICAgICAgICAiIiwgSURDX01BU1RIRUFEX1RFWFQsIDYwLCAxNCwgMjAwLCAxMgogICAgQ09OVFJPTCAgICAgICAgICIiLCBJRENfU1RBVElDLCJTdGF0aWMiLCBTU19CTEFDS0ZSQU1FIHwgU1NfU1VOS0VOLAogICAgICAgICAgICAgICAgICAgIDAsIDM5LCAzNDAsIDEKICAgIExURVhUICAgICAgICAgICAiIiwgSURDX0RPV05MT0FEX1RFWFQsIDEyLCA2MCwgMzE2LCAyMAogICAgTFRFWFQgICAgICAgICAgICIiLCBJRENfVElNRV9SRU1BSU5JTkcsIDEyLCA5MCwgMzE2LCAxMAogICAgQ09OVFJPTCAgICAgICAgICJQcm9ncmVzczEiLDEwMDYsIm1zY3Rsc19wcm9ncmVzczMyIixQQlNfU01PT1RILAogICAgICAgICAgICAgICAgICAgIDEyLCAxMDAsIDI2NSwgMTQKICAgIFBVU0hCVVRUT04JICAgICKO5o/BgrUiLCAgMiwgMjg1LCAxMDAsIDQ2LCAxNApFTkQKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gREVTSUdOSU5GTwovLwoKI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKR1VJREVMSU5FUyBERVNJR05JTkZPIERJU0NBUkRBQkxFIApCRUdJTgogICAgMTA1LCBESUFMT0cKICAgIEJFR0lOCiAgICAgICAgTEVGVE1BUkdJTiwgNwogICAgICAgIFJJR0hUTUFSR0lOLCAyMzYKICAgICAgICBUT1BNQVJHSU4sIDcKICAgICAgICBCT1RUT01NQVJHSU4sIDYzCiAgICBFTkQKRU5ECiNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gU3RyaW5nIFRhYmxlCi8vCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSAKQkVHSU4KICAgIElEU19ET1dOTE9BRF9DQU5DRUxfTUVTU0FHRSAgICKDQYN2g4qDUIFbg1aDh4OTgqqVS5d2gsaCt4LpkseJwYNSg5ODfIFbg2yDk4NngsyDQ4OTg1iDZ4Fbg4uC8INMg4ODk4Nag4uCt4LpgsaBQYNBg3aDioNQgVuDVoOHg5OCqo9Jl7mCt4LpicKUXJCrgqqCoILogtyCt4FCXG5cbpLHicGDUoOTg3yBW4Nsg5ODZ4LMg0ODk4NYg2eBW4OLgvCDTIODg5ODWoOLgrWCxILmguuCtYKigsWCt4KpgUgiCiAgICBJRFNfRE9XTkxPQURfQ0FOQ0VMX0NBUFRJT04gICAig0yDg4OTg1qDiyAtIJLHicGDUoOTg3yBW4Nsg5ODZyIKICAgIElEU19ET1dOTE9BRF9DQU5DRUxfSU5TVFJVQ1RJT04gICAiIgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fUkVRVUVTVF9USU1FT1VUICAgICAgIpDakbGCqoNeg0ODgINBg0WDZ4K1gtyCtYK9IgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fU0VSVkVSX05PVF9SRUFDSEFCTEUgIoNDg5ODXoFbg2yDYoNngsmQ2pGxgsWCq4LcgrmC8SIKICAgIElEU19IVFRQX0lOU1RSVUNUSU9OX1VOS05PV05fRVJST1IgICAgICAgICKDVIFbg2+BW4NHg4mBWyAog0eDiYFbICVzKSIKICAgIElEU19IVFRQX0lOU1RSVUNUSU9OX1NFUlZJQ0VfVU5BVkFJTCAgICAgICKDVIFbg3KDWJeYl3CVc4nCICiDR4OJgVsgJXMpIgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fRk9SQklEREVOICAgICAgICAgICAgIoNBg06DWoNYgqqLkZTbgtyCvYLNi9aOfoKzguqCxIKigtyCtyAog0eDiYFbICVzKSIKICAgIElEU19IVFRQX1NUQVRVU19PVEhFUiAgICAgICAgICAgICAgICAgICAgICKCsYLMl3aLgYLMj4iXnZKGgsmDR4OJgVuCqpStkLaCtYLcgrWCvYFCl3aLgYLwjcSOjo1zgrWC3IK3gqk/IgoKLy8gSFRUUCBzdGF0dXMgY29kZQogICAgSURTX0hUVFBfU1RBVFVTX1JFUVVFU1RfVElNRU9VVCAil3aLgYLwkdKLQJKGgsmDVIFbg2+BW4Kqg16DQ4OAg0GDRYNngrWC3IK1gr2BQiIKICAgIElEU19IVFRQX1NUQVRVU19GT1JCSURERU4JCSKDVIFbg2+BW4LNgUGXdouBgvCURo6vgrWCxIKigtyCt4KqgUGOwI1zgvCLkZTbgrWCxIKigtyCt4FCIgogICAgSURTX0hUVFBfU1RBVFVTX1NFUlZFUl9FUlJPUgkig1SBW4NvgVuCzYFBl3aLgYLMjsCNc4LwlleCsILpl1yK+oK1gsiCoo/zi7WCyZGYi/aCtYLcgrWCvYFCIgogICAgSURTX0hUVFBfU1RBVFVTX1NFUlZJQ0VfVU5BVkFJTAkig1SBW4Nyg1iCqojqjp6TSYLJg0mBW4NvgVuDjYFbg2iCtYLEgqKC3IK3gUIiCgoKICAgIElEU19ET1dOTE9BRF9TVEFUVVNfUkVUUlkJCSKDVIFbg2+BW4LNjLuN3YNyg1eBW4LFgreBQiVsZCCVYozjgsmNxI6OjXOCtYLcgrcgLi4uIgoKICAgIElEU19FUlJPUl9DQVBUSU9OICAgICAgICAgICAgICAgIoNHg4mBWyAtIEphdmEgg0qBW4Nsg4siCiAgICBJRFNfSE9VUlNNSU5VVEVTRUNPTkQJICAgICKXXJF6jmOC6I6eitQ6ICVkII6eitQgJWQglaogJS4wZiCVYiIKICAgIElEU19IT1VSTUlOVVRFU0VDT05ECSAgICAil1yReo5jguiOnorUOiAlZCCOnorUICVkIJWqICUuMGYglWIiCiAgICBJRFNfTUlOVVRFU0VDT05EIAkJICAgICKXXJF6jmOC6I6eitQ6ICVkIJWqICUuMGYglWIiCiAgICBJRFNfU0VDT05EICAgICAgICAgICAgICAgICAgICAgICKXXJF6jmOC6I6eitQ6ICUuMGYglWIiCiAgICBJRFNfRElTS19GVUxMX0VSUk9SX0NBUFRJT04gICAgICKDZoNCg1iDToKqgqKCwYLPgqKCxYK3IgogICAgSURTX0RJU0tfRlVMTF9FUlJPUiAgICAgICAgICAgICAig2aDQoNYg06CqoKigsGCz4KigsyCvYLfgUFKYXZhIINKgVuDbIOLgqqVS5d2gsiDUoOTg3yBW4Nsg5ODZ4Lwg1+DRYOTg42BW4NogsWCq4LcgrmC8YLFgrWCvYFCguCCpIjqk3iOjoK1gtyCt4KpPyIKICAgIElEU19ESVNLX1dSSVRFX0VSUk9SX0NBUFRJT04gICAgIoNmg0KDWINOj5GCq42egt2DR4OJgVsiCiAgICBJRFNfRElTS19XUklURV9FUlJPUiAgICAgICAgICAgICJKYXZhIINKgVuDbIOLgqqDZoNCg1iDToLWgsyPkYKrjZ6C3Y6egsmDR4OJgVuC8Iyfj2+CtYLcgrWCvYFCguCCpIjqk3iOjoK1gtyCt4KpPyIKICAgIElEU19IVFRQX1NUQVRVU19TRVJWRVJfTk9UX1JFQUNIQUJMRSAiSmF2YSCDSoFbg2yDi4LNgUGCqI5ngqKCzINWg1iDZYOAgsyMu43dgsyDQ4OTg16BW4Nsg2KDZ5DakbGQ3ZLogsWCzZOujeyCtYLcgrmC8YFCV2luZG93cyCCzINSg5ODZ4ONgVuDi4Nwg2yDi4LFgUGBdYNDg5ODXoFbg2yDYoNng0mDdoNWg4eDk4F2IC0+IIF1kNqRsYF2gvCRSZHwgrWCxIFBkN2S6IKoguaC0YN2g42DTINWj+6V8YKqkLOCtYKigrGCxoLwim2URoK1gsSCrYK+grOCooFCIgoKICAgIElEU19ET1dOTE9BRF9SRVRSWSAgICAgICAgICAgICAig1+DRYOTg42BW4Nog0eDiYFbIgogICAgSURTX0RPV05MT0FEX1JFVFJZX1RFWFQgICAgICAgICKXdouBgrOC6oK9g1KDk4N8gVuDbIOTg2eCzIjqlZSC8INfg0WDk4ONgVuDaJKGgsmDR4OJgVuCqpStkLaCtYLcgrWCvYFCgrGC6oLngsyDUoOTg3yBW4Nsg5ODZ4LMg1+DRYOTg42BW4NogvCNxJN4jo6C3YLcgreCqSA/IgoKICAgIElEU19ET1dOTE9BRCAgICAgICAgICAgICAgICAgICAikseJwYNSg5ODfIFbg2yDk4NngvCDQ4OTg1iDZ4Fbg4uCtYLEgqKC3IK3IgoJSURTX0RPV05MT0FEX1VOUEFDS0lORyAgICAgICAgICKDb4OTg2iDi4Lwk1eKSoK1gsSCooLcgrciCiAgICBJRFNfRE9XTkxPQURfVEVYVCAgICAgICAgICAgICAgIkphdmEgg0GDdoOKg1CBW4NWg4eDk4LNgUGVS5B7gsySx4nBg1KDk4N8gVuDbIOTg2eCzINfg0WDk4ONgVuDaIKoguaC0YNDg5ODWINngVuDi4zjgsmLTpOugrWC3IK3gUIiCiAgICAKICAgIElEU19GSUxFX1VQREFURV9FUlJPUiAgICAgICAgICAiJXMlcyCCzI1YkFaShoLJg0eDiYFbgqqUrZC2grWC3IK1gr2BQiIKICAgIElEU19GSUxFX0RFTEVURV9FUlJPUiAgICAgICAgICAiJXMggsyN7Y+ckoaCyYNHg4mBW4KqlK2QtoK1gtyCtYK9gUIiCiAgICBJRFNfSkFWQV9IT01FX0VSUk9SICAgICAgICAgICAgIkphdmEgg3qBW4OAg2aDQoOMg06DZ4OKgvCUu5LogsWCq4LcgrmC8YFCIgogICAgSURTX0tFUk5FTF9IT01FX0VSUk9SICAgICAgICAgICJqa2VybmVsLmRsbCCCzINwg1iC8JS7kuiCxYKrgtyCuYLxgUIiCiAgICBJRFNfSkJST0tFUl9FUlJPUiAgICAgICAgICAgICAgImpicm9rZXIuZXhlIILwi06TroLFgquC3IK5gvGBQiIKICAgIElEU19GQVRBTF9FUlJPUiAgICAgICAgICAgICAgICAiSmF2YSCCqpVLl3aCyINSg5ODfIFbg2yDk4NngvCDX4NFg5ODjYFbg2iCxYKrgtyCuYLxgsWCtYK9gUKDdoONg0+DiYOAgs2PSZe5grWC3IK3gUIiCiAgICBJRFNfRVJST1JfRE9XTkxPQURJTkdfQlVORExFX1BST1BFUlRJRVMgIkphdmEggqqDX4NFg5ODjYFbg2iDVIFbg2+BW4LGksqQTYLFgquC3IK5gvGCxYK1gr2BQoN2g42DT4OJg4CCzY9Jl7mCtYLcgreBQiIKICAgIElEU19FUlJPUl9NQUxGT1JNRURfQlVORExFX1BST1BFUlRJRVMgIkphdmEggqqDX4NFg5ODjYFbg2iDVIFbg2+BW4LGgsySypBNkoaCyYNHg4mBW4LwjJ+Pb4K1gtyCtYK9gUKDdoONg0+DiYOAgs2PSZe5grWC3IK3gUIiCiAgICBJRFNfRVJST1JfTUFMRk9STUVEX1VSTCAiSmF2YSCCqiBVUkwgJyVzJyCCqYLng1+DRYOTg42BW4NogsWCq4LcgrmC8YLFgrWCvYFCg3aDjYNPg4mDgILNj0mXuYK1gtyCt4FCIgpFTkQK