LyoKICogV2luZUZpbGUKICogQ3plY2ggTGFuZ3VhZ2UgU3VwcG9ydAogKgogKiBDb3B5cmlnaHQgMjAwMCBNYXJ0aW4gRnVjaHMKICogQ29weXJpZ2h0IDIwMDIgU3RldmVuIEVkd2FyZHMKICogQ29weXJpZ2h0IDIwMDIgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAyMDA0IERhdmlkIEtyZWRiYQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0NaRUNILCBTVUJMQU5HX0RFRkFVTFQKCi8qIE1lbnUgKi8KCklETV9XSU5FRklMRSBNRU5VIEZJWEVEIElNUFVSRQp7CglQT1BVUCAiJlNvdWJvciIgIHsKCQlNRU5VSVRFTSAiJk90ZXb47XRcdEVudGVyIiAsCQkJSURfQUNUSVZBVEUKCQlNRU5VSVRFTSAiUPhlJnN1bm91dC4uLlx0RjciICwgCQkJSURfRklMRV9NT1ZFCgkJTUVOVUlURU0gIiZLb3Dtcm92YXQuLi5cdEY4IiAsCQkJSURfRklMRV9DT1BZCgkJTUVOVUlURU0gIiZEbyBzY2hy4W5reS4uLlx0RjkiICwJCTExOAoJCU1FTlVJVEVNICImU21hemF0XHREZWwiICwJCQlJRF9GSUxFX0RFTEVURQoJCU1FTlVJVEVNICJQ+GVqbWUmbm92YXQuLi4iICwJCQkxMDkKCQlNRU5VSVRFTSAiVmxhc3Rub3N0JmkuLi5cdEFsdCtFbnRlciIgLCBJRF9FRElUX1BST1BFUlRJRVMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiSyZvbXByaW1vdmF0Li4uIiAsCQkxMTkKCQlNRU5VSVRFTSAiUiZvemJhbGl0Li4uIiAsCQkxMjAKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiU3AmdXN0aXQuLi4iICwJCQlJRF9FWEVDVVRFCgkJTUVOVUlURU0gIiZUaXNrLi4uIiAsIAkJCTEwMgoJCU1FTlVJVEVNICJQ+Gn4YWRpdC4uLiIgLAkJMTAzCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlZ5dHZv+Gl0ICZhZHJlc+H4Li4uIiAsCQkJMTExCgkJTUVOVUlURU0gIiZIbGVkYXQuLi4iICwJCQkxMDQKCQlNRU5VSVRFTSAiViZ5YnJhdCBzb3Vib3J5Li4uIiAsCQkJMTE2CgkJTUVOVUlURU0gU0VQQVJBVE9SCiNpZm5kZWYgX05PX0VYVEVOU0lPTlMKCQlNRU5VSVRFTSAiJktvbmVjXHRBbHQrWCIgLCAJCQlJRF9GSUxFX0VYSVQKI2Vsc2UKCQlNRU5VSVRFTSAiJktvbmVjIiwgCQkJCUlEX0ZJTEVfRVhJVAojZW5kaWYKCX0KCglQT1BVUCAiJkRpc2siICB7CgkJTUVOVUlURU0gIiZLb3Dtcm92YXQgZGlzay4uLiIgLAkJCTIwMQoJCU1FTlVJVEVNICImUG9qbWVub3ZhdCBkaXNrLi4uIiAsCQkJMjAyCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZGb3Jt4XRvdmF0IGRpc2suLi4iICwJCQlJRF9GT1JNQVRfRElTSwojaWZkZWYgX1dJTjk1CgkJTUVOVUlURU0gIlZ5dHZv+Gl0IHN5c3TpJm1vdv0gZGlzay4uLiIsIC0xCS8qQEAgKi8KI2VuZGlmCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlD4aXBvaml0IHPtu292/SAmZGlzayIgLAkJCUlEX0NPTk5FQ1RfTkVUV09SS19EUklWRQoJCU1FTlVJVEVNICImT2Rwb2ppdCBz7btvdv0gZGlzayIgLAkJSURfRElTQ09OTkVDVF9ORVRXT1JLX0RSSVZFCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlNk7WxldCBqYWtvLi4uIiAsCQkJMjU0CgkJTUVOVUlURU0gIk9kc3QmcmFuaXQgc2TtbGVu7S4uLiIgLAkJCTI1NQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImVnlicmF0IGplZG5vdGt1Li4uIiAsCQkJMjUxCgl9CgoJUE9QVVAgIkEmZHJlc+H4ZSIgIHsKCQlNRU5VSVRFTSAiRCZhbLntIPpyb3Zl8lx0KyIgLAkJCTMwMQoJCU1FTlVJVEVNICJSb3piYWxpdCBzJnRyb21cdCoiICwJCTMwMgoJCU1FTlVJVEVNICJSb3piYWxpdCAmdrllXHRTdHJnKyoiICwJCTMwMwoJCU1FTlVJVEVNICJTYmFsaXQgc3Qmcm9tXHQtIiAsCQkJMzA0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIk96bmHoaXQgcG90byZta2EiICwJCQkJNTA1Cgl9CgoJUE9QVVAgIiZab2JyYXplbu0iICB7CgkJTUVOVUlURU0gIlN0JnJvbSBhIGFkcmVz4fgiICwJCQk0MTMKCQlNRU5VSVRFTSAiSiZlbiBzdHJvbSIgLAkJCTQxMQoJCU1FTlVJVEVNICJKZW4gYSZkcmVz4fgmIiAsCQkJNDEyCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlMmbG916Gl0IiAsCQkJSURfVklFV19TUExJVAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImTuF6ZXYiICwJCQlJRF9WSUVXX05BTUUKCQlNRU5VSVRFTSAiJla5ZWNobnkgZGV0YWlseSIgLAkJCQlJRF9WSUVXX0FMTF9BVFRSSUJVVEVTLCBDSEVDS0VECgkJTUVOVUlURU0gIlYmeWJyYW7pIGRldGFpbHkuLi4iICwJCQlJRF9WSUVXX1NFTEVDVEVEX0FUVFJJQlVURVMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJlT47WRpdCBkbGUgbuF6dnUiICwJCTQwNAoJCU1FTlVJVEVNICJU+O1kaXQgZGxlIHQmeXB1IiAsCQk0MDUKCQlNRU5VSVRFTSAiVPjtZGl0IGRsZSBWZWxpa29zdCZpIiAsIAkJNDA2CgkJTUVOVUlURU0gIlT47WRpdCBkbGUgJmRhdGEiICwgCQk0MDcKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiVPjtZGl0IGRsZSAgJi4uLiIgLAkJCUlEX1ZJRVdfRklMVEVSCgl9CgoJUE9QVVAgIiZOYXN0YXZlbu0iICB7CgkJTUVOVUlURU0gIiZQb3R2cnpvduFu7S4uLiIgLAkJNTAxCgkJTUVOVUlURU0gIlDtcyZtby4uLiIgLAkJCUlEX1NFTEVDVF9GT05UCgkJTUVOVUlURU0gIlVwcmF2aXQgcHImdWggbuFzdHJvavkuLi4iICwgNTEyCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIk7hcyZ0cm9qZSIgLAkJSURfVklFV19UT09MX0JBUiwgQ0hFQ0tFRAoJCU1FTlVJVEVNICJQcnVoICZqZWRub3RlayIgLAlJRF9WSUVXX0RSSVZFX0JBUiwgQ0hFQ0tFRAoJCU1FTlVJVEVNICImU3Rhdm92/SBwcnVoIiAsCUlEX1ZJRVdfU1RBVFVTQkFSLCBDSEVDS0VECiNpZm5kZWYgX05PX0VYVEVOU0lPTlMKCQlNRU5VSVRFTSAiTmEgcCZsbm91IG9icmF6b3ZrdVx0Q3RybCtTaGlmdCtTIiAsIAlJRF9WSUVXX0ZVTExTQ1JFRU4KI2VuZGlmCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlNwdXN0aXQgJm1pbmltYWxpem92YW7sIiAsCQk1MDQKCQlNRU5VSVRFTSAiVWxvvml0IG5hJnN0YXZlbu0gcPhpIHVrb27oZW7tIiAsCTUxMQoJfQoKCglQT1BVUCAiWmEmYmV6cGXoZW7tIiAgewoJCU1FTlVJVEVNICImUPjtc3R1cC4uLiIgLAkJNjA1CgkJTUVOVUlURU0gIiZaYXpuYW1lbuF24W7tLi4uIiAsCQkJNjA2CgkJTUVOVUlURU0gIiZWbGFzdG7tay4uLiIgLAkJNjA3Cgl9CgoJUE9QVVAgIiZPa25hIiAgewoJCU1FTlVJVEVNICJOb3bpICZva25vIiAsCQkJSURfV0lORE9XX05FVwoJCU1FTlVJVEVNICJaYSBzZWJvdVx0Q3RybCtGNSIgLAkJSURfV0lORE9XX0NBU0NBREUKCQlNRU5VSVRFTSAiRGxhvmRpY2UgJnZvZG9yb3Zu7CIgLAlJRF9XSU5ET1dfVElMRV9IT1JaCgkJTUVOVUlURU0gIkRsYb5kaWNlICZzdmlzbGVcdEN0cmwrRjQiICwJCUlEX1dJTkRPV19USUxFX1ZFUlQKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICJWeXJvdm5hdCBhdXRvbWF0aWNreSIgLAkJSURfV0lORE9XX0FVVE9TT1JUCiNlbmRpZgoJCU1FTlVJVEVNICJWeXJvdiZuYXQiICwJCUlEX1dJTkRPV19BUlJBTkdFCgkJTUVOVUlURU0gIlD4ZWsmcmVzbGl0XHRGNSIgLAkJSURfUkVGUkVTSAoJfQoKCVBPUFVQICImPyIgIHsKCQlNRU5VSVRFTSAiT2JzYSZoIG7hcG927GR5XHRGMSIgLAkJCUlEX0hFTFAKCQlNRU5VSVRFTSAiSGxlZOFu7SB2ICZu4XBvduxk7C4uLlx0RjEiICwJCQlJRF9IRUxQCgkJTUVOVUlURU0gIkphayBwbya+7XZhdCBu4XBvduxkdVx0RjEiICwJCUlEX0hFTFBfVVNJTkcKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkluZm9ybWFjZSBvIFdpbmVmaWxlLi4uIiAsCQkJSURfQUJPVVQKCQlNRU5VSVRFTSAiSW5mb3JtYWNlIG8gJldpbmUuLi4iICwJCQlJRF9BQk9VVF9XSU5FCgl9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJTcHVzdGl0IgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUNPTlRST0wgCQkiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCglDT05UUk9MIAkJIiZQ+O1rYXo6IiAsIC0xLCAiU3RhdGljIiwgU1NfTEVGVE5PV09SRFdSQVB8V1NfR1JPVVAsIDMsIDE4LCA2MCwgMTAKCUVESVRURVhUCQkyMDEsIDMsIDI5LCAxMzQsIDEyLCBFU19BVVRPSFNDUk9MTAoJQ09OVFJPTCAJCSJKYWtvICZzeW1ib2wiICwgMjE0LCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YfFdTX1RBQlNUT1AsMywgNDUsIDcxLCAxMgoJREVGUFVTSEJVVFRPTgkJIk9LIiAsIDEsIDE1OCwgNiwgNDcsIDE0CglQVVNIQlVUVE9OCQkiU3Rvcm5vIiAsIDIsIDE1OCwgMjMsIDQ3LCAxNAoJUFVTSEJVVFRPTgkJIiZO4XBvduxkYSIgLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9CgpJRERfU0VMRUNUX0RFU1RJTkFUSU9OIERJQUxPRyBGSVhFRCBJTVBVUkUgMTUsIDEzLCAyMTAsIDYzClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIlVy6GVu7SBj7WxlIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUNPTlRST0wgCQkiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCglDT05UUk9MIAkJIkMmZXN0YToiICwgLTEsICJTdGF0aWMiLCBTU19MRUZUTk9XT1JEV1JBUHxXU19HUk9VUCwgMywgMTgsIDYwLCAxMAoJRURJVFRFWFQJCTIwMSwgMywgMjksIDEzNCwgMTIsIEVTX0FVVE9IU0NST0xMCglERUZQVVNIQlVUVE9OCQkiT0siICwgMSwgMTU4LCA2LCA0NywgMTQKCVBVU0hCVVRUT04JCSJTdG9ybm8iICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkiUHImb2No4XpldCIgLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9CgpTVFJJTkdUQUJMRQp7CglJRFNfRk9OVF9TRUxfRExHX05BTUUJIk3sbu1tIG5hc3RhdmVu7SBw7XNtYSIKCUlEU19GT05UX1NFTF9FUlJPUgkiQ2h5YmEgcPhpIHb9YuxydSBub3bpaG8gcO1zbWEuIgp9CgpTVFJJTkdUQUJMRQp7CiBJRFNfV0lORUZJTEUgIldpbmVmaWxlIgogSURTX0VSUk9SICAiQ2h5YmEiCiBJRFNfUk9PVF9GUyAgImtv+GVub3b9IGZzIgogSURTX1VOSVhGUyAgInVuaXhmcyIKIElEU19ERVNLVE9QICAiUGxvY2hhIgogSURTX1NIRUxMICAiSW50ZXJwcmV0IgogSURTX1RJVExFRk1UICIlcyAtICVzIgogSURTX05PX0lNUEwgICJOZW7tIGRvc3VkIGltcGxlbWVudG924W5vIgogSURTX1dJTkUgICJXSU5FIgogSURTX1dJTkVfRklMRSAiV2luZSBGaWxlIgp9CgpTVFJJTkdUQUJMRQp7CiBJRFNfQ09MX05BTUUgIk7hemV2IgogSURTX0NPTF9TSVpFICJWZWxpa29zdCIKIElEU19DT0xfQ0RBVEUgIkRhdHVtIHZ5dHZv+GVu7SIKIElEU19DT0xfQURBVEUgIkRhdHVtIHBvc2xlZG7taG8gcPjtc3R1cHUiCiBJRFNfQ09MX01EQVRFICJEYXR1bSBwb3NsZWRu7SBtb2RpZmlrYWNlIgogSURTX0NPTF9JRFggICJJbmRleC9Jbm9kZSIKIElEU19DT0xfTElOS1MgIkxpbmt5IgogSURTX0NPTF9BVFRSICJBdHJpYnV0eSIKIElEU19DT0xfU0VDICAiWmFiZXpwZehlbu0iCn0K