LyoKICogV2luZUZpbGUKICogSXRhbGlhbiBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwIE1hcnRpbiBGdWNocwogKiBDb3B5cmlnaHQgMjAwMiBTdGV2ZW4gRWR3YXJkcwogKiBDb3B5cmlnaHQgMjAwMiBBbGV4YW5kcmUgSnVsbGlhcmQKICogQ29weXJpZ2h0IDIwMDQgSXZhbiBMZW8gUHVvdGkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19JVEFMSUFOLCBTVUJMQU5HX05FVVRSQUwKCi8qIE1lbnUgKi8KCklETV9XSU5FRklMRSBNRU5VIEZJWEVEIElNUFVSRQp7CglQT1BVUCAiJkZpbGUiICB7CgkJTUVOVUlURU0gIiZBcHJpXHRJbnZpbyIgLAkJCUlEX0FDVElWQVRFCgkJTUVOVUlURU0gIiZTcG9zdGEuLi5cdEY3IiAsIAkJCUlEX0ZJTEVfTU9WRQoJCU1FTlVJVEVNICImQ29waWEuLi5cdEY4IiAsCQkJSURfRklMRV9DT1BZCgkJTUVOVUlURU0gIiZOZWdsaSBBcHB1bnRpLi4uXHRGOSIgLAkJMTE4CgkJTUVOVUlURU0gIiZDYW5jZWxsYVx0RGVsIiAsCQkJSURfRklMRV9ERUxFVEUKCQlNRU5VSVRFTSAiUmkmbm9taW5hLi4uIiAsCQkJMTA5CgkJTUVOVUlURU0gIlByb3ByaSZldOAuLi5cdEFsdCtJbnZpbyIgLCBJRF9FRElUX1BST1BFUlRJRVMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiQyZvbXByaW1pLi4uIiAsCQkxMTkKCQlNRU5VSVRFTSAiRGVjJm9tcHJpbWkuLi4iICwJCTEyMAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImRXNlZ3VpLi4uIiAsCQkJSURfRVhFQ1VURQoJCU1FTlVJVEVNICImU3RhbXBhLi4uIiAsIAkJCTEwMgoJCU1FTlVJVEVNICJBc3NvY2lhLi4uIiAsCQkxMDMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiQ3ImZWEgRGlyZWN0b3J5Li4uIiAsCQkJMTExCgkJTUVOVUlURU0gIkNlcmMmYS4uLiIgLAkJCTEwNAoJCU1FTlVJVEVNICImU2VsZXppb25hIGkgZmlsZS4uLiIgLAkJCTExNgoJCU1FTlVJVEVNIFNFUEFSQVRPUgojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIkUmc2NpXHRBbHQrWCIgLCAJCQlJRF9GSUxFX0VYSVQKI2Vsc2UKCQlNRU5VSVRFTSAiRSZzY2kiLCAJCQkJSURfRklMRV9FWElUCiNlbmRpZgoJfQoKCVBPUFVQICImRGlzY28iICB7CgkJTUVOVUlURU0gIiZDb3BpYSBEaXNjby4uLiIgLAkJCTIwMQoJCU1FTlVJVEVNICImRXRpY2hldHRhIERpc2NvLi4uIiAsCQkJMjAyCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZGb3JtYXR0YSBEaXNjby4uLiIgLAkJCUlEX0ZPUk1BVF9ESVNLCiNpZmRlZiBfV0lOOTUKCQlNRU5VSVRFTSAiJkNyZWEgRGlzY28gZGkgU2lzdGVtYS4uLiIsIC0xCS8qQEAgKi8KI2VuZGlmCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkNvbm5ldHRpICYgRHJpdmUgZGkgUmV0ZSIgLAkJCUlEX0NPTk5FQ1RfTkVUV09SS19EUklWRQoJCU1FTlVJVEVNICImRGlzY29ubmV0dGkgRHJpdmUgZGkgUmV0ZSIgLAkJSURfRElTQ09OTkVDVF9ORVRXT1JLX0RSSVZFCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkNvbmRpdmlkaSBjb21lLi4uIiAsCQkJMjU0CgkJTUVOVUlURU0gIiZSaW11b3ZpIGNvbmRpdmlzaW9uZS4uLiIgLAkJCTI1NQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImU2VsZXppb25hIERyaXZlLi4uIiAsCQkJMjUxCgl9CgoJUE9QVVAgIiZEaXJlY3RvcnkiICB7CgkJTUVOVUlURU0gIiZMaXZlbGxvIFN1Y2Vzc2l2b1x0KyIgLAkJCTMwMQoJCU1FTlVJVEVNICJFc3BhbmRpICZBbGJlcm9cdCoiICwJCTMwMgoJCU1FTlVJVEVNICJFc3BhbmRpICZ0dXR0b1x0U3RyZysqIiAsCQkzMDMKCQlNRU5VSVRFTSAiUmlkdWNpICZBbGJlcm9cdC0iICwJCQkzMDQKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJlNlbGV6aW9uYSB1bml04CIgLAkJCQk1MDUKCX0KCglQT1BVUCAiJlZpc3VhbGl6emEiICB7CgkJTUVOVUlURU0gIkEmbGJlcm8gZSBEaXJlY3RvcnkiICwJCQk0MTMKCQlNRU5VSVRFTSAiU28mbG8gQWxiZXJvIiAsCQkJNDExCgkJTUVOVUlURU0gIiZTb2xvIERpcmVjdG9yeSIgLAkJCTQxMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJEaSZ2aWRpIiAsCQkJSURfVklFV19TUExJVAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImTm9tZSIgLAkJCUlEX1ZJRVdfTkFNRQoJCU1FTlVJVEVNICImTW9zdHJhIHR1dHRpIGkgZGV0dGFnbGkgc3VpIGZpbGUiICwJCQkJSURfVklFV19BTExfQVRUUklCVVRFUywgQ0hFQ0tFRAoJCU1FTlVJVEVNICImTW9zdHJhIGRldHRhZ2xpIHBhcnppYWxpLi4uIiAsCQkJSURfVklFV19TRUxFQ1RFRF9BVFRSSUJVVEVTCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZPcmRpbmEgcGVyIE5vbWUiICwJCUlEX1ZJRVdfU09SVF9OQU1FCgkJTUVOVUlURU0gIiZPcmRpbmEgcGVyIFRpcG8iICwJCUlEX1ZJRVdfU09SVF9UWVBFCgkJTUVOVUlURU0gIiZPcmRpbmEgcGVyIERpbWVuc2lvbmUiICwgCUlEX1ZJRVdfU09SVF9TSVpFCgkJTUVOVUlURU0gIiZPcmRpbmEgcGVyIERhdGEiICwgCQlJRF9WSUVXX1NPUlRfREFURQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJPcmRpbmEgcGVyICYuLi4iICwJCQlJRF9WSUVXX0ZJTFRFUgoJfQoKCVBPUFVQICImT3B6aW9uaSIgIHsKCQlNRU5VSVRFTSAiJkNvbmZlcm1hemlvbmUuLi4iICwJCTUwMQoJCU1FTlVJVEVNICImRm9udC4uLiIgLAkJCUlEX1NFTEVDVF9GT05UCgkJTUVOVUlURU0gIiZQZXJzb25hbGl6emEgYmFycmEgZGVnbGkgc3RydW1lbnRpLi4uIiAsIDUxMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImQmFycmEgZGVnbGkgc3RydW1lbnRpIiAsCQlJRF9WSUVXX1RPT0xfQkFSLCBDSEVDS0VECgkJTUVOVUlURU0gIiZCYXJyYSBkZWkgRHJpdmUiICwJCUlEX1ZJRVdfRFJJVkVfQkFSLCBDSEVDS0VECgkJTUVOVUlURU0gIiZCYXJyYSBkaSBzdGF0byIgLAlJRF9WSUVXX1NUQVRVU0JBUiwgQ0hFQ0tFRAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIkEmIHR1dHRvIHNjaGVybW9cdEN0cmwrU2hpZnQrUyIgLCAJSURfVklFV19GVUxMU0NSRUVOCiNlbmRpZgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImRXNlZ3VpIG1pbmltaXp6YXRvIiAsCQk1MDQKCQlNRU5VSVRFTSAiJlNhbHZhIGltcG9zdGF6aW9uaSBhbGwndXNjaXRhIiAsCQkJNTExCgl9CgoKCVBPUFVQICImU2ljdXJlenphIiAgewoJCU1FTlVJVEVNICImQWNjZXNzaS4uLiIgLAkJNjA1CgkJTUVOVUlURU0gIiZMb2dnaW5nLi4uIiAsCQkJNjA2CgkJTUVOVUlURU0gIiZQcm9wcmlldGFyaW8uLi4iICwJCTYwNwoJfQoKCVBPUFVQICImRmluZXN0cmEiICB7CgkJTUVOVUlURU0gIk51b3ZhICZGaW5lc3RyYSIgLAkJCUlEX1dJTkRPV19ORVcKCQlNRU5VSVRFTSAiRmluZXN0cmUgYSBjYXNjYXRhXHRDdHJsK0Y1IiAsCQlJRF9XSU5ET1dfQ0FTQ0FERQoJCU1FTlVJVEVNICJPcmRpbmEgJk9yaXpvbnRhbG1lbnRlIiAsCQlJRF9XSU5ET1dfVElMRV9IT1JaCgkJTUVOVUlURU0gIk9yZGluYSAmVmVydGljbG1lbnRlXHRDdHJsK0Y0IiAsCQlJRF9XSU5ET1dfVElMRV9WRVJUCiNpZm5kZWYgX05PX0VYVEVOU0lPTlMKCQlNRU5VSVRFTSAiRGlzcG9uaSBhdXRvbWF0aWNhbWVudGUiICwJCUlEX1dJTkRPV19BVVRPU09SVAojZW5kaWYKCQlNRU5VSVRFTSAiRGlzcG9uaSAmU2ltYm9saSIgLAkJSURfV0lORE9XX0FSUkFOR0UKCQlNRU5VSVRFTSAiJkFnZ2lvcm5hXHRGNSIgLAkJSURfUkVGUkVTSAoJfQoKCVBPUFVQICImR3VpZGEiICB7CgkJTUVOVUlURU0gIiZTb21tYXJpbyBkZWxsYSBHdWlkYVx0RjEiICwJCQlJRF9IRUxQCgkJTUVOVUlURU0gIiZDZXJjYSBuZWxsYSBHdWlkYS4uLlx0RjEiICwJCQlJRF9IRUxQCgkJTUVOVUlURU0gIiZVc28gZGVsbCBHdWlkYVx0RjEiICwJCQlJRF9IRUxQX1VTSU5HCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZJbmZvcm1hemlvbmkgc3UgV2luZWZpbGUuLi4iICwJCQlJRF9BQk9VVAoJCU1FTlVJVEVNICJJbmZvcm1hemlvbmkgc3UgJldpbmUuLi4iICwJCQlJRF9BQk9VVF9XSU5FCgl9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJFc2VndWkiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJQ09OVFJPTCAJCSIiLCAxMDEsICJTdGF0aWMiLCBTU19TSU1QTEV8U1NfTk9QUkVGSVgsIDMsIDYsIDE2MiwgMTAKCUNPTlRST0wgCQkiJkNvbWFuZG86IiAsIC0xLCAiU3RhdGljIiwgU1NfTEVGVE5PV09SRFdSQVB8V1NfR1JPVVAsIDMsIDE4LCA2MCwgMTAKCUVESVRURVhUCQkyMDEsIDMsIDI5LCAxMzQsIDEyLCBFU19BVVRPSFNDUk9MTAoJQ09OVFJPTCAJCSJDb21lICZTaW1ib2xvIiAsIDIxNCwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWHxXU19UQUJTVE9QLDMsIDQ1LCA3MSwgMTIKCURFRlBVU0hCVVRUT04JCSJPSyIgLCAxLCAxNTgsIDYsIDQ3LCAxNAoJUFVTSEJVVFRPTgkJIkFubnVsbGEiICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkiJkFpdXRvIiAsIDI1NCwgMTU4LCA0MywgNDcsIDE0Cn0KCklERF9TRUxFQ1RfREVTVElOQVRJT04gRElBTE9HIEZJWEVEIElNUFVSRSAxNSwgMTMsIDIxMCwgNjMKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiU2VsZWN0IGRlc3RpbmF0aW9uIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUNPTlRST0wgCQkiIiwgMTAxLCAiU3RhdGljbyIsIFNTX1NJTVBMRXxTU19OT1BSRUZJWCwgMywgNiwgMTYyLCAxMAoJQ09OVFJPTCAJCSImUGVyY29yc286IiAsIC0xLCAiU3RhdGljbyIsIFNTX0xFRlROT1dPUkRXUkFQfFdTX0dST1VQLCAzLCAxOCwgNjAsIDEwCglFRElUVEVYVAkJMjAxLCAzLCAyOSwgMTM0LCAxMiwgRVNfQVVUT0hTQ1JPTEwKCURFRlBVU0hCVVRUT04JCSJPSyIgLCAxLCAxNTgsIDYsIDQ3LCAxNAoJUFVTSEJVVFRPTgkJIkFubnVsbGEiICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkiJk5hdmlnYSIgLCAyNTQsIDE1OCwgNDMsIDQ3LCAxNAp9CgpTVFJJTkdUQUJMRQp7CglJRFNfRk9OVF9TRUxfRExHX05BTUUJIkFwcGxpY2EgbGUgaW1wb3N0YXppb25pIGRlaSBmb250IgoJSURTX0ZPTlRfU0VMX0VSUk9SCSJTaSDoIHZlcmlmaWNhdG8gdW4gZXJyb3JlIGR1cmFudGUgbGEgc2VsZXppb25lIGRlbCBudW92byBmb250LiIKfQo=