LyoKICogQ29weXJpZ2h0IDIwMDMgVWxyaWNoIEN6ZWthbGxhIGZvciBDb2RlV2VhdmVycwogKiBDb3B5cmlnaHQgMjAwNiBNaWtvbGFqIFphbGV3c2tpCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJyZXNvdXJjZS5oIgoKTEFOR1VBR0UgTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVAoKVUlJTlNFUlRPQkpFQ1QgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAzMTAsIDE1MQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJXc3RhdyBvYmlla3QiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBJRENfT0JKVFlQRUxJU1QsODIsMTksMTMxLDY2LExCU19TT1JUIHwKICAgICAgICAgICAgICAgICAgICBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMIHwKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QCiAgICBMVEVYVCAgICAgICAgICAgIlR5cCBvYmlla3R1OiIsSURDX09CSlRZUEVMQkwsODIsNyw1Myw4LFdTX1ZJU0lCTEUKICAgIERFRlBVU0hCVVRUT04gICAiT0siLElET0ssMjI5LDcsNjYsMTQKICAgIFBVU0hCVVRUT04gICAgICAiQW51bHVqIixJRENBTkNFTCwyMjksMjQsNjYsMTQKICAgIEdST1VQQk9YICAgICAgICAiV3luaWsiLElEQ19SRVNVTFQsNywxMDMsMjA4LDQxCiAgICBDT05UUk9MICAgICAgICAgIlV0d/NyeiBub3d5IixJRENfQ1JFQVRFTkVXLCJCdXR0b24iLEJTX0FVVE9SQURJT0JVVFRPTiB8IAogICAgICAgICAgICAgICAgICAgIFdTX0dST1VQLDcsMjAsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAiVXR383J6IGtvbnRyb2xr6iIsSURDX0NSRUFURUNPTlRST0wsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgTk9UIFdTX1ZJU0lCTEUsNyw1NCw3MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJVdHfzcnogeiBwbGlrdSIsSURDX0NSRUFURUZST01GSUxFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiw3LDM3LDY3LDEwCiAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX1JFU1VMVERFU0MsNDksMTEyLDE1OSwyMwogICAgUFVTSEJVVFRPTiAgICAgICImRG9kYWoga29udHJvbGvqLi4uIixJRENfQUREQ09OVFJPTCw4MSw4OCw2MywxNCxOT1QgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAgICJXeZx3aWV0bGFqIGpha28gaWtvbuoiLElEQ19BU0lDT04sIkJ1dHRvbiIsQlNfQVVUT0NIRUNLQk9YIHwgCiAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUCB8IE5PVCBXU19WSVNJQkxFLDIyMyw1OCw4NCwxMAogICAgUFVTSEJVVFRPTiAgICAgICJQcnplZ2y5ZGFqLi4uIixJRENfQlJPV1NFLDgzLDUzLDUwLDE0LE5PVCBXU19WSVNJQkxFCiAgICBMVEVYVCAgICAgICAgICAgIlBsaWs6IixJRENfRklMRUxCTCw4MywyNywyMCw4LCBOT1QgV1NfVklTSUJMRQogICAgRURJVFRFWFQgICAgICAgIElEQ19GSUxFLDgzLDM3LDEzMiwxMyxFU19BVVRPSFNDUk9MTCB8IE5PVCBXU19WSVNJQkxFCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogIElEU19SRVNVTFRPQkpERVNDCSJXc3RhdyBub3d5IG9iaWVrdCAlcyBkbyBkb2t1bWVudHUiCiAgSURTX1JFU1VMVEZJTEVPQkpERVNDCSJXc3RhdyB6YXdhcnRvnOYgcGxpa3UgamFrbyBvYmlla3QgZG8gZG9rdW1lbnR1LiBC6mR6aWUgbW+/bmEgZ28gYWt0eXdvd2HmIHW/eXdharljIHByb2dyYW11LCBrdPNyeSBnbyBzdHdvcnp5sy4iCiAgSURTX0JST1dTRSAgICAgICAgICAgICJQcnplZ2y5ZGFqIgogIElEU19OT1RPTEVNT0QgICAgICAgICAiUGxpayBuaWUgd3lkYWplIHNp6iBieeYgcG9wcmF3bnltIG1vZHWzZW0gT0xFLiBOaWUgdWRhs28gc2nqIHphcmVqZXN0cm93YeYga29udHJvbGtpIE9MRS4iCiAgSURTX05PVE9MRU1PRENBUFRJT04gICJEb2RhaiBrb250cm9sa+oiCn0KCklERF9QQVNURVNQRUNJQUw0IERJQUxPRyBESVNDQVJEQUJMRSAzLCAxNSwgMzA5LCAxNDAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIldrbGVqIHNwZWNqYWxuaWUiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExURVhUICAgICAgICAgIo9y82SzbzoiLCAtMSwgNiwgOSwgMzAsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgQ09OVFJPTCAgICAgICAiJldrbGVqIiwgSURDX1BTX1BBU1RFLCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgNiwgMzgsIDU1LCAxMAogICAgQ09OVFJPTCAgICAgICAiV2tsZWogJrO5Y3plIiwgSURDX1BTX1BBU1RFTElOSywgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDYsIDYzLCA1NSwgMTAKICAgIExURVhUICAgICAgICAgIiZKYWtvOiIsIC0xLCA2NSwgMjUsIDE2LCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElTVCwgICAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSU5LTElTVCwgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19ESVNQTEFZTElTVCwgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAiT0siLCBJRE9LLCAiQnV0dG9uIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDIzMiwgNiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICJBbnVsdWoiLCBJRENBTkNFTCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjMyLCAyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICImUG9tb2MiLCBJRENfT0xFVUlIRUxQLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMzIsIDQyLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIlcmeZx3aWV0bGFqIGpha28gaWtvbuoiLCBJRENfUFNfRElTUExBWUFTSUNPTiwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDU5LCA4NCwgMTQKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19JQ09ORElTUExBWSwgIlN0YXRpYyIsIFNTX0lDT04gfCBXU19WSVNJQkxFLCAyMzIsIDc1LCA2NiwgNDQKICAgIENPTlRST0wgICAgICAgIlptaWXxICZpa29u6i4uLiIsIElEQ19QU19DSEFOR0VJQ09OLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMzIsIDEyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfUkVTVUxUSU1BR0UsICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgOCwgMTAxLCA0MiwgMzQKICAgIENPTlRST0wgICAgICAgIjw8IHRla3N0IHd5bmlrb3d5IHByenljaG9kemkgdHV0YWogPj4iLCBJRENfUFNfUkVTVUxUVEVYVCwgIlN0YXRpYyIsIFNTX05PUFJFRklYIHwgV1NfVklTSUJMRSwgNTQsIDEwMCwgMTU5LCAzNQogICAgQ09OVFJPTCAgICAgICAiV3luaWsiLCAtMSwgIkJ1dHRvbiIsIEJTX0dST1VQQk9YIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCA2LCA5MCwgMjEyLCA0OAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1NPVVJDRVRFWFQsICJFZGl0IiwgRVNfUkVBRE9OTFkgfCBFU19BVVRPSFNDUk9MTCB8IFdTX1ZJU0lCTEUsIDM3LCA5LCAxODAsIDgKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfUFNfUEFTVEVfREFUQSAgICAgICAgICAgICAgICAgICAgICJXc3Rhd2lhIHphd2FydG+c5iBzY2hvd2thIGRvIGRva3VtZW50dSBqYWtvICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIldzdGF3aWEgemF3YXJ0b5zmIHNjaG93a2EgZG8gZG9rdW1lbnR1LCB0YWsgYWJ5IG3zZ7MgYnnmIGFrdHl3b3dhbnkgemEgcG9tb2O5ICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1RfQVNfSUNPTiAgICAgICAgICAgIldzdGF3aWEgemF3YXJ0b5zmIHNjaG93a2EgZG8gZG9rdW1lbnR1LCB0YWsgYWJ5IG3zZ7MgYnnmIGFrdHl3b3dhbnkgemEgcG9tb2O5ICVzLiBC6mR6aWUgd3mcd2lldGxhbnkgamFrbyBpa29uYS4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19EQVRBICAgICAgICAgICAgICAgICJXc3Rhd2lhIHphd2FydG+c5iBzY2hvd2thIGRvIGRva3VtZW50dSBqYWtvICVzLiBEYW5lIGLqZLkgcG+zuWN6b25lIHogcGxpa2llbSCfcvNks293eW0sIGR6aepraSBjemVtdSB6bWlhbnkgdyBwbGlrdSBi6mS5IG9kendpZXJjaWVkbG9uZSB3IGRva3VtZW5jaWUuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUICAgICAgICAgICAgICAiV3N0YXdpYSB6YXdhcnRvnOYgc2Nob3drYSBkbyBkb2t1bWVudHUgamFrbyBvYnJhei4gT2JyYXogYupkemllIHBvs7ljem9ueSB6IHBsaWtpZW0gn3LzZLNvd3ltLCBkemnqa2kgY3plbXUgem1pYW55IHcgcGxpa3UgYupkuSBvZHp3aWVyY2llZGxvbmUgdyBkb2t1bWVuY2llLiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVF9BU19JQ09OICAgICAgIldzdGF3aWEgZG8gZG9jdW1lbnR1IHNrcvN0IGRvIHphd2FydG+cY2kgc2Nob3drYS4gU2ty83QgYupkemllIHBvs7ljem9ueSB6IHBsaWtpZW0gn3LzZLNvd3ltLCBkemnqa2kgY3plbXUgem1pYW55IHcgcGxpa3UgYupkuSBvZHp3aWVyY2llZGxvbmUgdyBkb2t1bWVuY2llLiIKICAgIElEU19QU19OT05fT0xFICAgICAgICAgICAgICAgICAgICAgICAgIldzdGF3aWEgemF3YXJ0b5zmIHNjaG93a2EgZG8gZG9rdW1lbnR1IgogICAgSURTX1BTX1VOS05PV05fVFlQRSAgICAgICAgICAgICAgICAgICAiTmllem5hbnkgdHlwIgogICAgSURTX1BTX1VOS05PV05fU1JDICAgICAgICAgICAgICAgICAgICAiTmllem5hbmUgn3LzZLNvIgogICAgSURTX1BTX1VOS05PV05fQVBQICAgICAgICAgICAgICAgICAgICAicHJvZ3JhbSwga3TzcnkgZ28gc3R3b3J6ebMiCn0K