LyoKICogQ29weXJpZ2h0IDIwMDQgSGVubmluZyBHZXJoYXJkdAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0dFUk1BTiwgU1VCTEFOR19ORVVUUkFMCgpVSUlOU0VSVE9CSkVDVCBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDI5NCwgMTUxClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIk9iamVrdCBlaW5m/GdlbiIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTElTVEJPWCAgICAgICAgIElEQ19PQkpUWVBFTElTVCw4MiwxOSwxMzEsNjYsTEJTX1NPUlQgfAogICAgICAgICAgICAgICAgICAgIExCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVklTSUJMRSB8IFdTX1ZTQ1JPTEwgfAogICAgICAgICAgICAgICAgICAgIFdTX1RBQlNUT1AKICAgIExURVhUICAgICAgICAgICAiT2JqZWt0dHlwOiIsSURDX09CSlRZUEVMQkwsODIsNyw1Myw4LFdTX1ZJU0lCTEUKICAgIERFRlBVU0hCVVRUT04gICAiT0siLElET0ssMjIxLDcsNjYsMTQKICAgIFBVU0hCVVRUT04gICAgICAiQWJicmVjaGVuIixJRENBTkNFTCwyMjEsMjQsNjYsMTQKICAgIEdST1VQQk9YICAgICAgICAiRXJnZWJuaXMiLElEQ19SRVNVTFQsNywxMDMsMjA4LDQxCiAgICBDT05UUk9MICAgICAgICAgIiZOZXUgZXJzdGVsbGVuIixJRENfQ1JFQVRFTkVXLCJCdXR0b24iLEJTX0FVVE9SQURJT0JVVFRPTiB8IAogICAgICAgICAgICAgICAgICAgIFdTX0dST1VQLDcsMjAsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAiUyZ0ZXVlcnVuZyBlcnN0ZWxsZW4iLElEQ19DUkVBVEVDT05UUk9MLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiB8IE5PVCBXU19WSVNJQkxFLDcsNTQsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAiQSZ1cyBEYXRlaSBlcnN0ZWxsZW4iLElEQ19DUkVBVEVGUk9NRklMRSwiQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04sNywzNyw2NywxMAogICAgTFRFWFQgICAgICAgICAgICIiLElEQ19SRVNVTFRERVNDLDQ5LDExMiwxNTksMjMKICAgIFBVU0hCVVRUT04gICAgICAiU3RldWVydW5nIGhpbiZ6dWb8Z2VuIixJRENfQUREQ09OVFJPTCw4MSw4OCw2MywxNCxOT1QgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAgICJBbHMgJlN5bWJvbCBhbnplaWdlbiIsSURDX0FTSUNPTiwiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QIHwgTk9UIFdTX1ZJU0lCTEUsMjIzLDU4LDY0LDEwCiAgICBQVVNIQlVUVE9OICAgICAgIkQmdXJjaHN1Y2hlbi4uLiIsSURDX0JST1dTRSw4Myw1Myw1MCwxNCxOT1QgV1NfVklTSUJMRQogICAgTFRFWFQgICAgICAgICAgICJEYXRlaToiLElEQ19GSUxFTEJMLDgzLDI3LDIwLDgsIE5PVCBXU19WSVNJQkxFCiAgICBFRElUVEVYVCAgICAgICAgSURDX0ZJTEUsODMsMzcsMTMyLDEzLEVTX0FVVE9IU0NST0xMIHwgTk9UIFdTX1ZJU0lCTEUKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgSURTX1JFU1VMVE9CSkRFU0MJIkb8Z3QgZWluIG5ldWVzICVzIC0gT2JqZWt0IGluIElociBEb2t1bWVudCBlaW4uIgogIElEU19SRVNVTFRGSUxFT0JKREVTQwkiRvxndCBkZW4gSW5oYWx0IGRlciBEYXRlaSBhbHMgT2JqZWt0IHNvIGluIElociBEb2t1bWVudCBlaW4sIGRhc3MgU2llIGVzIG1pdCBkZW0gUHJvZ3JhbW0gYWt0aXZpZXJlbiBr9m5uZW4sIG1pdCBkZW0gZXMgZXJzdGVsbHQgd3VyZGUuIgogIElEU19CUk9XU0UgICAgICAgICAgICAiRHVyY2hzdWNoZW4iCiAgSURTX05PVE9MRU1PRCAgICAgICAgICJEaWUgRGF0ZWkgaXN0IG9mZmVuYmFyIGtlaW4gZ/xsdGlnZXMgT0xFIC0gU3RldWVybW9kdWwuIERpZSBPTEUgLSBTdGV1ZXJ1bmcga29ubnRlIG5pY2h0IHJlZ2lzdGllcnQgd2VyZGVuLiIKICBJRFNfTk9UT0xFTU9EQ0FQVElPTiAgIlN0ZXVlcnVuZyBoaW56dWb8Z2VuIgp9CgpJRERfUEFTVEVTUEVDSUFMNCBESUFMT0cgRElTQ0FSREFCTEUgMywgMTUsIDI5MywgMTQwClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19TRVRGT05UIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJJbmhhbHRlIGVpbmb8Z2VuIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBMVEVYVCAgICAgICAgICJRdWVsbGU6IiwgLTEsIDYsIDksIDMwLCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIENPTlRST0wgICAgICAgIiZFaW5m/GdlbiIsIElEQ19QU19QQVNURSwgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDYsIDM4LCA1NSwgMTAKICAgIENPTlRST0wgICAgICAgIiZWZXJrbvxwZnVuZyBlaW5m/GdlbiIsIElEQ19QU19QQVNURUxJTkssICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCA2MywgNTUsIDEwCiAgICBMVEVYVCAgICAgICAgICImQWxzOiIsIC0xLCA2NSwgMjUsIDE2LCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElTVCwgICAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSU5LTElTVCwgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19ESVNQTEFZTElTVCwgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAiT0siLCBJRE9LLCAiQnV0dG9uIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICJBYmJyZWNoZW4iLCBJRENBTkNFTCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICImSGlsZmUiLCBJRENfT0xFVUlIRUxQLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDQyLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIkFscyBTeW1ib2wgJmRhcnN0ZWxsZW4iLCBJRENfUFNfRElTUExBWUFTSUNPTiwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDU5LCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19JQ09ORElTUExBWSwgIlN0YXRpYyIsIFNTX0lDT04gfCBXU19WSVNJQkxFLCAyMjQsIDc1LCA2NiwgNDQKICAgIENPTlRST0wgICAgICAgIiZTeW1ib2wg5G5kZXJuLi4uIiwgSURDX1BTX0NIQU5HRUlDT04sICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgMTIzLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19SRVNVTFRJTUFHRSwgIlN0YXRpYyIsIFNTX0lDT04gfCBXU19WSVNJQkxFLCA4LCAxMDEsIDQyLCAzNAogICAgQ09OVFJPTCAgICAgICAiPDwgcmVzdWx0IHRleHQgZ29lcyBoZXJlID4+IiwgSURDX1BTX1JFU1VMVFRFWFQsICJTdGF0aWMiLCBTU19OT1BSRUZJWCB8IFdTX1ZJU0lCTEUsIDU0LCAxMDAsIDE1OSwgMzUKICAgIENPTlRST0wgICAgICAgIkVyZ2VibmlzIiwgLTEsICJCdXR0b24iLCBCU19HUk9VUEJPWCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwgNiwgOTAsIDIxMiwgNDgKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19TT1VSQ0VURVhULCAiRWRpdCIsIEVTX1JFQURPTkxZIHwgRVNfQVVUT0hTQ1JPTEwgfCBXU19WSVNJQkxFLCAzNywgOSwgMTgwLCA4CkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURTX1BTX1BBU1RFX0RBVEEgICAgICAgICAgICAgICAgICAgICAiRvxndCBkZW4gSW5oYWx0IGRlciBad2lzY2hlbmFibGFnZSBpbiBJaHIgRG9rdW1lbnQgYWxzICVzIGVpbi4iCiAgICBJRFNfUFNfUEFTVEVfT0JKRUNUICAgICAgICAgICAgICAgICAgICJG/Gd0IGRlbiBJbmhhbHQgZGVyIFp3aXNjaGVuYWJsYWdlIHNvIGluIElociBEb2t1bWVudCBlaW4gZGFzcyBTaWUgZXMgbWl0ICVzIGFrdGl2aWVyZW4ga/ZubmVuLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1RfQVNfSUNPTiAgICAgICAgICAgIkb8Z3QgZGVuIEluaGFsdCBkZXIgWndpc2NoZW5hYmxhZ2Ugc28gaW4gSWhyIERva3VtZW50IGVpbiBkYXNzIFNpZSBlcyBtaXQgJXMgYWt0aXZpZXJlbiBr9m5uZW4uICBXaXJkIGFscyBTeW1ib2wgZGFyZ2VzdGVsbHQuIgogICAgSURTX1BTX1BBU1RFX0xJTktfREFUQSAgICAgICAgICAgICAgICAiRvxndCBkZW4gSW5oYWx0IGRlciBad2lzY2hlbmFibGFnZSBpbiBJaHIgRG9rdW1lbnQgYWxzICVzIGVpbi4gIERpZSBEYXRlbiBzaW5kIG1pdCBkZXIgVXJzcHJ1bmdzZGF0ZWkgdmVya278cGZ0IHNvIGRhc3MgxG5kZXJ1bmdlbiBhbiBkaWVzZXIgaW4gSWhyZW0gRG9rdW1lbnQgZXJzY2hlaW5lbi4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19PQkpFQ1QgICAgICAgICAgICAgICJG/Gd0IGVpbiBCaWxkIGRlcyBad2lzY2hlbmFibGFnZW4tSW5oYWx0cyBpbiBJaHIgRG9rdW1lbnQgZWluLiAgRGFzIEJpbGQgaXN0IG1pdCBkZXIgVXJzcHJ1bmdzZGF0ZWkgdmVya278cGZ0IHNvIGRhc3MgxG5kZXJ1bmdlbiBhbiBkaWVzZXIgaW4gSWhyZW0gRG9rdW1lbnQgZXJzY2hlaW5lbi4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19PQkpFQ1RfQVNfSUNPTiAgICAgICJG/Gd0IGVpbmUgVmVya278cGZ1bmcgZWluIGRpZSBhdWYgZGVuIE9ydCBkZXMgWndpc2NoZW5hYmxhZ2VuLUluaGFsdHMgemVpZ3QuICBEaWUgVmVya278cGZ1bmcgaXN0IG1pdCBkZXIgVXJzcHJ1bmdzZGF0ZWkgdmVya278cGZ0IHNvIGRhc3MgxG5kZXJ1bmdlbiBhbiBkaWVzZXIgaW4gSWhyZW0gRG9rdW1lbnQgZXJzY2hlaW5lbi4iCiAgICBJRFNfUFNfTk9OX09MRSAgICAgICAgICAgICAgICAgICAgICAgICJG/Gd0IGRlbiBJbmhhbHQgZGVyIFp3aXNjaGVuYWJsYWdlIGluIElociBEb2t1bWVudCBhbHMgZWluLiIKICAgIElEU19QU19VTktOT1dOX1RZUEUgICAgICAgICAgICAgICAgICAgIlVuYmVrYW5udGVyIFR5cCIKICAgIElEU19QU19VTktOT1dOX1NSQyAgICAgICAgICAgICAgICAgICAgIlVuYmVrYW5udGUgUXVlbGxlIgogICAgSURTX1BTX1VOS05PV05fQVBQICAgICAgICAgICAgICAgICAgICAiZGVtIEVyemV1Z2VycHJvZ3JhbW0iCn0K