LyoKICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbGV4YW5kZXIgTi4gU/hybmVzIDxhbGV4QHRoZWhhbmRvZmFnb255LmNvbT4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgInJlc291cmNlLmgiCgpMQU5HVUFHRSBMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMCgpVSUlOU0VSVE9CSkVDVCBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDI5NCwgMTUxClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIlNldHQgaW5uIG9iamVrdCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTElTVEJPWCAgICAgICAgIElEQ19PQkpUWVBFTElTVCw4MiwxOSwxMzEsNjYsTEJTX1NPUlQgfAogICAgICAgICAgICAgICAgICAgIExCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVklTSUJMRSB8IFdTX1ZTQ1JPTEwgfAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AKICAgIExURVhUICAgICAgICAgICAiT2JqZWt0dHlwZWU6IixJRENfT0JKVFlQRUxCTCw4Miw3LDUzLDgsV1NfVklTSUJMRQogICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywyMjEsNyw2NiwxNAogICAgUFVTSEJVVFRPTiAgICAgICJBdmJyeXQiLElEQ0FOQ0VMLDIyMSwyNCw2NiwxNAogICAgR1JPVVBCT1ggICAgICAgICJSZXN1bHRhdCIsSURDX1JFU1VMVCw3LDEwMywyMDgsNDEKICAgIENPTlRST0wgICAgICAgICAiT3BwcmV0dCBueSIsSURDX0NSRUFURU5FVywiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04gfCAKICAgICAgICAgICAgICAgICAgICBXU19HUk9VUCw3LDIwLDYyLDEwCiAgICBDT05UUk9MICAgICAgICAgIk9wcHJldHQga29udHJvbGxlciIsSURDX0NSRUFURUNPTlRST0wsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgTk9UIFdTX1ZJU0lCTEUsNyw1NCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJPcHByZXR0IGZyYSBmaWwiLElEQ19DUkVBVEVGUk9NRklMRSwiQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04sNywzNyw2NywxMAogICAgTFRFWFQgICAgICAgICAgICIiLElEQ19SRVNVTFRERVNDLDQ5LDExMiwxNTksMjMKICAgIFBVU0hCVVRUT04gICAgICAiJkxlZ2cgdGlsIGtvbnRyb2xsZXIuLi4iLElEQ19BRERDT05UUk9MLDgxLDg4LDYzLDE0LE5PVCBXU19WSVNJQkxFCiAgICBDT05UUk9MICAgICAgICAgIlZpcyBzb20gaWtvbiIsSURDX0FTSUNPTiwiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QIHwgTk9UIFdTX1ZJU0lCTEUsMjIzLDU4LDY0LDEwCiAgICBQVVNIQlVUVE9OICAgICAgIkJsYS4uLiIsSURDX0JST1dTRSw4Myw1Myw1MCwxNCxOT1QgV1NfVklTSUJMRQogICAgTFRFWFQgICAgICAgICAgICJGaWw6IixJRENfRklMRUxCTCw4MywyNywyMCw4LCBOT1QgV1NfVklTSUJMRQogICAgRURJVFRFWFQgICAgICAgIElEQ19GSUxFLDgzLDM3LDEzMiwxMyxFU19BVVRPSFNDUk9MTCB8IE5PVCBXU19WSVNJQkxFCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogIElEU19SRVNVTFRPQkpERVNDCSJTZXR0IGlubiBldCBueXR0ICVzLW9iamVrdCBpIGRva3VtZW50ZXQiCiAgSURTX1JFU1VMVEZJTEVPQkpERVNDCSJTZXR0IGZpbGVucyBpbm5ob2xkIGlubiBzb20gZXQgb2JqZWt0IGkgZG9rdW1lbnRldCwgc+VubiBhdCBkdSBrYW4gYWt0aXZlcmUgZGV0IHZlZCBoamVscCBhdiBwcm9ncmFtbWV0IHNvbSBsYWdldCBkZW4uIgogIElEU19CUk9XU0UgICAgICAgICAgICAiQmxhIgogIElEU19OT1RPTEVNT0QgICAgICAgICAiRmlsZW4gc2VyIGlra2UgdXQgdGlsIOUgduZyZSBlbiBneWxkaWcgT0xFLW1vZHVsLiBLdW5uZSBpa2tlIHJlZ2lzdHJlcmUgT0xFLWtvbnRyb2xsZXIuIgogIElEU19OT1RPTEVNT0RDQVBUSU9OICAiTGVnZyB0aWwga29udHJvbGxlciIKfQoKSUREX1BBU1RFU1BFQ0lBTDQgRElBTE9HIERJU0NBUkRBQkxFIDMsIDE1LCAyOTMsIDE0MApTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfU0VURk9OVCB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiTGltIGlubiBzcGVzaWVsbCIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTFRFWFQgICAgICAgICAiS2lsZGU6IiwgLTEsIDYsIDksIDMwLCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIENPTlRST0wgICAgICAgIkxpbSBpbiZuIiwgSURDX1BTX1BBU1RFLCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgNiwgMzgsIDU1LCAxMAogICAgQ09OVFJPTCAgICAgICAiTGltIGlubiBrb2ImbGluZyIsIElEQ19QU19QQVNURUxJTkssICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCA2MywgNTUsIDEwCiAgICBMVEVYVCAgICAgICAgICImU29tOiIsIC0xLCA2NSwgMjUsIDE2LCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElTVCwgICAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSU5LTElTVCwgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19ESVNQTEFZTElTVCwgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAiT0siLCBJRE9LLCAiQnV0dG9uIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICJBdmJyeXQiLCBJRENBTkNFTCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICImSGplbHAiLCBJRENfT0xFVUlIRUxQLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDQyLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiZWaXMgc29tIGlrb24iLCBJRENfUFNfRElTUExBWUFTSUNPTiwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDU5LCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19JQ09ORElTUExBWSwgIlN0YXRpYyIsIFNTX0lDT04gfCBXU19WSVNJQkxFLCAyMjQsIDc1LCA2NiwgNDQKICAgIENPTlRST0wgICAgICAgIkVuZHJlICZpa29uLi4uIiwgSURDX1BTX0NIQU5HRUlDT04sICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgMTIzLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19SRVNVTFRJTUFHRSwgIlN0YXRpYyIsIFNTX0lDT04gfCBXU19WSVNJQkxFLCA4LCAxMDEsIDQyLCAzNAogICAgQ09OVFJPTCAgICAgICAiPDwgcmVzdWx0YXRldCBrb21tZXIgaGVyID4+IiwgSURDX1BTX1JFU1VMVFRFWFQsICJTdGF0aWMiLCBTU19OT1BSRUZJWCB8IFdTX1ZJU0lCTEUsIDU0LCAxMDAsIDE1OSwgMzUKICAgIENPTlRST0wgICAgICAgIlJlc3VsdGF0IiwgLTEsICJCdXR0b24iLCBCU19HUk9VUEJPWCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwgNiwgOTAsIDIxMiwgNDgKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19TT1VSQ0VURVhULCAiRWRpdCIsIEVTX1JFQURPTkxZIHwgRVNfQVVUT0hTQ1JPTEwgfCBXU19WSVNJQkxFLCAzNywgOSwgMTgwLCA4CkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURTX1BTX1BBU1RFX0RBVEEgICAgICAgICAgICAgICAgICAgICAiU2V0dGVyIGlubmhvbGRldCBmcmEgdXRrbGlwcHN0YXZsZW4gaW5uIGkgZG9rdW1lbnRldCBzb20gJXMuIgogICAgSURTX1BTX1BBU1RFX09CSkVDVCAgICAgICAgICAgICAgICAgICAiU2V0dGVyIGlubmhvbGRldCBmcmEgdXRrbGlwcHN0YXZsZW4gaW5uIGkgZG9rdW1lbnRldCBz5SBkdSBrYW4gYWt0aXZlcmUgZGV0IG1lZCAlcy4iCiAgICBJRFNfUFNfUEFTVEVfT0JKRUNUX0FTX0lDT04gICAgICAgICAgICJTZXR0ZXIgaW5uaG9sZGV0IGZyYSB1dGtsaXBwc3RhdmxlbiBpbm4gaSBkb2t1bWVudGV0IHPlIGR1IGthbiBha3RpdmVyZSBkZXQgbWVkICAlcy4gIERldCB2aXNlcyBzb20gZXQgaWtvbi4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19EQVRBICAgICAgICAgICAgICAgICJTZXR0ZXIgaW5uaG9sZGV0IGZyYSB1dGtsaXBwc3RhdmxlbiBpbm4gaSBkb2t1bWVudGV0IHNvbSAlcy4gRGV0IGtvYmxlcyB0aWwga2lsZGVmaWxlbiBz5SBlbmRyZXIgaSBkZW5uZSBvZ3PlIHNramVyIGkgZG9rdW1lbnRldC4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19PQkpFQ1QgICAgICAgICAgICAgICJTZXR0ZXIgaW5uIGV0IGJpbGRlIGF2IHV0a2xpcHBzdGF2bGVpbm5ob2xkZXQgaSBkb2t1bWVudGV0LiBCaWxkZXQga29ibGVzIHRpbCBraWxkZWZpbGVuIHPlIGVuZHJpbmdlciBpIGRlbm5lIG9nc+Ugc2tqZXIgaSBkb2t1bWVudGV0IC4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19PQkpFQ1RfQVNfSUNPTiAgICAgICJTZXR0ZXIgaW5uIGVuIHNuYXJ2ZWkgc29tIHBla2VyIHRpbCBwbGFzc2VyaW5nZW4gYXYgaW5uaG9sZGV0IHDlIHV0a2xpcHBzdGF2bGVuLiBTbmFydmVpZW4ga29ibGVzIHRpbCBraWxkZWZpbGVuIHPlIGVuZHJpbmdlciBpIGRlbm5lIG9nc+Ugc2tqZXIgaSBkb2t1bWVudGV0LiIKICAgIElEU19QU19OT05fT0xFICAgICAgICAgICAgICAgICAgICAgICAgIlNldHRlciBpbm5ob2xkZXQgZnJhIHV0a2xpcHBzdGF2bGVuIGlubiBpIGRva3VtZW50ZXQuIgogICAgSURTX1BTX1VOS05PV05fVFlQRSAgICAgICAgICAgICAgICAgICAiVWtqZW50IHR5cGUiCiAgICBJRFNfUFNfVU5LTk9XTl9TUkMgICAgICAgICAgICAgICAgICAgICJVa2plbnQga2lsZGUiCiAgICBJRFNfUFNfVU5LTk9XTl9BUFAgICAgICAgICAgICAgICAgICAgICJwcm9ncmFtbWV0IHNvbSBsYWdldCBkZXQiCn0K