LyoKICogQ29weXJpZ2h0IDIwMDUsMjAwNyBZdW5Tb25nIEh3YW5nCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJyZXNvdXJjZS5oIgoKTEFOR1VBR0UgTEFOR19LT1JFQU4sIFNVQkxBTkdfREVGQVVMVAoKVUlJTlNFUlRPQkpFQ1QgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAyOTQsIDE1MQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICKwtMO8ILvwwNQiCkZPTlQgOSwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBJRENfT0JKVFlQRUxJU1QsODIsMTksMTMxLDY2LExCU19TT1JUIHwKICAgICAgICAgICAgICAgICAgICBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMIHwKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QCiAgICBMVEVYVCAgICAgICAgICAgIrC0w7wgxbjA1DoiLElEQ19PQkpUWVBFTEJMLDgyLDcsNTMsOCxXU19WSVNJQkxFCiAgICBERUZQVVNIQlVUVE9OICAgIsiuwM4iLElET0ssMjIxLDcsNjYsMTQKICAgIFBVU0hCVVRUT04gICAgICAiw+u80iIsSURDQU5DRUwsMjIxLDI0LDY2LDE0CiAgICBHUk9VUEJPWCAgICAgICAgIrDhsPoiLElEQ19SRVNVTFQsNywxMDMsMjA4LDQxCiAgICBDT05UUk9MICAgICAgICAgIrv1t84guLi16bHiIixJRENfQ1JFQVRFTkVXLCJCdXR0b24iLEJTX0FVVE9SQURJT0JVVFRPTiB8IAogICAgICAgICAgICAgICAgICAgIFdTX0dST1VQLDcsMjAsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAixMHGrrfRILi4temx4iIsSURDX0NSRUFURUNPTlRST0wsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgTk9UIFdTX1ZJU0lCTEUsNyw1NCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICLGxMDPt866zsXNILi4temx4iIsSURDX0NSRUFURUZST01GSUxFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiw3LDM3LDY3LDEwCiAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX1JFU1VMVERFU0MsNDksMTEyLDE1OSwyMwogICAgUFVTSEJVVFRPTiAgICAgICLEwcaut9Egw9+woSgmQSkuLi4iLElEQ19BRERDT05UUk9MLDgxLDg4LDYzLDE0LE5PVCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICAgIr7GwMzE3MC4t84gurix4iIsSURDX0FTSUNPTiwiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QIHwgTk9UIFdTX1ZJU0lCTEUsMjIzLDU4LDY0LDEwCiAgICBQVVNIQlVUVE9OICAgICAgIsOjseIuLi4iLElEQ19CUk9XU0UsMTU1LDg4LDUwLDE0LE5PVCBXU19WSVNJQkxFCiAgICBMVEVYVCAgICAgICAgICAgIsbEwM86IixJRENfRklMRUxCTCw1OCwyMSwyMCw4LCBOT1QgV1NfVklTSUJMRQogICAgRURJVFRFWFQgICAgICAgIElEQ19GSUxFLDgzLDM3LDEzMiwxMyxFU19BVVRPSFNDUk9MTCB8IE5PVCBXU19WSVNJQkxFCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogIElEU19SRVNVTFRPQkpERVNDCSK79SAgJXMgsLTDvLimILmuvK2/oSC78MDUIgogIElEU19SRVNVTFRGSUxFT0JKREVTQwkiwNu8usfRIMeusde4ssC7ILvnv+vHz7+pIMiwvLrIrb3DxbO89iDA1rTCILC0w7y4piC5rrytxsTAzyCzu7/rwLi3ziC78MDUx8+9w7/ALiIKICBJRFNfQlJPV1NFICAgICAgICAgICAgIsOjseIiCiAgSURTX05PVE9MRU1PRCAgICAgICAgICLAzCDGxMDPwLogv8O52bilIE9MRbjwteLAzCC+xrTRsMW3ziC6uMDUtM+02S4gT0xFxMHGrrfRwLsgte63z8fSvPYgvvi9wLTPtNkuIgogIElEU19OT1RPTEVNT0RDQVBUSU9OICAixMHGrrfRILT1x8+x4iIKfQoKSUREX1BBU1RFU1BFQ0lBTDQgRElBTE9HIERJU0NBUkRBQkxFIDMsIDE1LCAyOTMsIDE0MApTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfU0VURk9OVCB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAixq+6sMfPsNQgILrZv6mz1rHiIgpGT05UIDksICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBMVEVYVCAgICAgICAgICK/+Lq7OiIsIC0xLCA2LCA5LCAzMCwgOCwgV1NfVklTSUJMRSB8IFdTX0dST1VQCiAgICBDT05UUk9MICAgICAgICK62b+ps9ax4igmUCkiLCBJRENfUFNfUEFTVEUsICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICAxLCA0NCwgNTUsIDEwCiAgICBDT05UUk9MICAgICAgICK4tcWpt84gutm/qbPWseIoJkwpIiwgSURDX1BTX1BBU1RFTElOSywgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDEsIDYxLCA2OSwgMTAKICAgIExURVhUICAgICAgICAgIrTZuKUgwMy4p8C4t84oJkEpOiIsIC0xLCA2NywgMjUsIDUzLCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElTVCwgICAgIDY2LCAzNiwgMTUwLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSU5LTElTVCwgNjYsIDM2LCAxNTAsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19ESVNQTEFZTElTVCwgICA2NiwgMzYsIDE1MCwgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAiyK7AziIsIElET0ssICJCdXR0b24iLCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwgMjI0LCA2LCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIsPrvNIiLCBJRENBTkNFTCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICK1tb/yuLsoJkgpIiwgSURDX09MRVVJSEVMUCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCA0MiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICK+xsDMxNzAuLfOILq4seIoJkQpIiwgSURDX1BTX0RJU1BMQVlBU0lDT04sICJCdXR0b24iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCA1OSwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfSUNPTkRJU1BMQVksICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgMjI0LCA3NSwgNjYsIDQ0CiAgICBDT05UUk9MICAgICAgICK+xsDMxNwgudmy2bHiKCZJKS4uLiIsIElEQ19QU19DSEFOR0VJQ09OLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDEyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfUkVTVUxUSU1BR0UsICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgOCwgMTAxLCA0MiwgMzQKICAgIENPTlRST0wgICAgICAgIjw8ILDhsPogxdi9usautMIgv6mx4rTZsKEgPj4iLCBJRENfUFNfUkVTVUxUVEVYVCwgIlN0YXRpYyIsIFNTX05PUFJFRklYIHwgV1NfVklTSUJMRSwgNTQsIDEwMCwgMTU5LCAzNQogICAgQ09OVFJPTCAgICAgICAisOGw+iIsIC0xLCAiQnV0dG9uIiwgQlNfR1JPVVBCT1ggfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDYsIDkwLCAyMTIsIDQ4CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfU09VUkNFVEVYVCwgIkVkaXQiLCBFU19SRUFET05MWSB8IEVTX0FVVE9IU0NST0xMIHwgV1NfVklTSUJMRSwgMzcsIDksIDE4MCwgOApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19QU19QQVNURV9EQVRBICAgICAgICAgICAgICAgICAgICAgIrTnvcXAxyC5rrytICVzv6Egxay4s7q4teXAxyCzu7/rILvwwNTHz7HiLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIrTnvcXAxyC5rrytv6Egxay4s7q4teXAxyCzu7/rtenAuyDDt7rOx8+46SAgJXO4piC757/rx9i8rSDAzLDNwLsgvcfH4MfSILz2IMDWvcC0z7TZLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1RfQVNfSUNPTiAgICAgICAgICAgIrTnvcXAxyC5rrytv6Egxay4s7q4teXAxyCzu7/rtenAuyDDt7rOx8+46SAgJXO4piC757/rx9i8rSDAzLDNwLsgvcfH4MfSILz2IMDWvcC0z7TZLiDAzLDNwLogvsbAzMTcwLi3ziCzqsW4s7vB+iCwzLTPtNkuIgogICAgSURTX1BTX1BBU1RFX0xJTktfREFUQSAgICAgICAgICAgICAgICAitOe9xcDHILmuvK0gJXO/oSDFrLizuri15cDHILO7v+sgu/DA1MfPseIuICDAzCC1pcDMxc20wiC/+Lq7IMbEwM+/oSC/rLDhtce+7iDA1r7uvK0gxsTAz8DMILnZsu646SC0573FwMcgua68rbW1ILnZsvCwzLTPtNkuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUICAgICAgICAgICAgICAitOe9xcDHILmuvK2/oSDFrLizuri15b+hIMDWtMIgsde4ssC7IMH9vu6z1r3AtM+02S4gIMDMILHXuLLAuiC/+Lq7IMbEwM+/oSC/rLDhtce+7iDA1r7uvK0gxsTAz8DMILnZsu646SC0573FwMcgua68rbW1ILnZsvCwzLTPtNkuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUX0FTX0lDT04gICAgICAitOe9xcDHILmuvK2/oSDFrLizuri15b+hIMDWtMIgtNzD4L7GwMzE3MC7IMH9vu6z1r3AtM+02S4gIMDMILTcw+C+xsDMxNzAuiC/+Lq7IMbEwM+/oSC/rLDhtce+7iDA1r7uvK0gxsTAz8DMILnZsu646SC0573FwMcgua68rbW1ILnZsvCwzLTPtNl0LiIKICAgIElEU19QU19OT05fT0xFICAgICAgICAgICAgICAgICAgICAgICAgIrTnvcXAxyC5rrytv6Egxay4s7q4teXAxyCzu7/rILvwwNTHz7HiLiIKICAgIElEU19QU19VTktOT1dOX1RZUEUgICAgICAgICAgICAgICAgICAgIr7LvPYgvvi0wiDH/L3EIgogICAgSURTX1BTX1VOS05PV05fU1JDICAgICAgICAgICAgICAgICAgICAivsu89iC++LTCIL/4ursiCiAgICBJRFNfUFNfVU5LTk9XTl9BUFAgICAgICAgICAgICAgICAgICAgICLAzCDHwbfOsde3pcC6IL7LILz2IL74tMIgx8G3zrHXt6XAuLfOILi4tem+7sGzvcC0z7TZIgp9Cg==