LyoKICogQ29weXJpZ2h0IDE5OTYgRHVuY2FuIEMgVGhvbXNvbgogKiBDb3B5cmlnaHQgMjAwNiBBbnRvbmlvIENvZGF6emkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19FU1BFUkFOVE8sIFNVQkxBTkdfREVGQVVMVAoKU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKewogTUVOVUlURU0gIiZSZW5vcm1hbGlndSIsIDYxNzI4CiBNRU5VSVRFTSAiJk1vdmkiLCA2MTQ1NgogTUVOVUlURU0gIiZHcmFuZGVjbyIsIDYxNDQwCiBNRU5VSVRFTSAiRSZ0aWd1IiwgNjE0NzIKIE1FTlVJVEVNICImRWdpZ3UiLCA2MTQ4OAogTUVOVUlURU0gU0VQQVJBVE9SCiBNRU5VSVRFTSAiJkZlcm11XHRBbHQtRjQiLCA2MTUzNgogTUVOVUlURU0gU0VQQVJBVE9SCiBNRU5VSVRFTSAiJkFsaWEgdGFza28gLi4uXHRDdHJsLUVzYyIsIDYxNzQ0CiBNRU5VSVRFTSBTRVBBUkFUT1IKIE1FTlVJVEVNICImUHJpIFdJTkUgLi4uIiwgNjE3NjEKIE1FTlVJVEVNICJFJm5tZXR1ICdEZWJ1ZyBtYXJrJyBlbiAnZGVidWcgbG9nJyIsIDYxNzYyCn0KCkVESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQp7CglQT1BVUCAiIgoJQkVHSU4KCQlNRU5VSVRFTSAiJk51bGlndSIsIEVNX1VORE8KCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiRWwmdG9uZHUiLCBXTV9DVVQKCQlNRU5VSVRFTSAiJktvcGl1IiwgV01fQ09QWQoJCU1FTlVJVEVNICImRW5tZXR1IiwgV01fUEFTVEUKCQlNRU5VSVRFTSAiJkZvcmlndSIsIFdNX0NMRUFSCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkVsZWt0dSDmaW9uIiwgRU1fU0VUU0VMCglFTkQKfQoKTVNHQk9YIERJQUxPRyAxMDAsIDgwLCAyMTYsIDE2OApTVFlMRSBEU19NT0RBTEZSQU1FIHwgRFNfTk9JRExFTVNHIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQkVHSU4KICAgICAgICBJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKICAgICAgICBMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBTU19OT1BSRUZJWAogICAgICAgIFBVU0hCVVRUT04gIiZCb25lIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICImUmV6aWduaSIsIDIsIDY0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiAgICAgICAgUFVTSEJVVFRPTiAiJk51bGlnaSIsIDMsIDExMiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIiZSZXByb3Z1IiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiAgICAgICAgUFVTSEJVVFRPTiAiJklnbm9ydSIsIDUsIDIwOCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgIFBVU0hCVVRUT04gIiZKZXMiLCA2LCAyNTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICBQVVNIQlVUVE9OICJOJmUiLCA3LCAzMDQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKRU5ECgkKTURJX01PUkVXSU5ET1dTIERJQUxPRyBGSVhFRCBJTVBVUkUgMjAsIDIwLCAyMzIsIDEyMgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJFbGVrdHUgRmVuZXN0cm9uIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCglMSVNUQk9YICAgICAgICAgTURJX0lEQ19MSVNUQk9YLCA1LCA3LCAyMjIsIDkwLCBXU19WU0NST0xMIHwgV1NfSFNDUk9MTCAvKiBkZWZpbmVkIGluIG1kaS5oICovCglERUZQVVNIQlVUVE9OICAgIkJvbmUiLCBJRE9LLCA3NSwgMTAwLCAzNSwgMTQKCVBVU0hCVVRUT04gICAgICAiUmV6aWduaSIsIElEQ0FOQ0VMLCAxMjAsIDEwMCwgMzUsIDE0CkVORAoJCgkKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewoJSURTX0VSUk9SICJFcm9ybyIKCUlEU19NRElfTU9SRVdJTkRPV1MgIiZQbGkgRmVuZXN0cm9qLi4uIgp9Cg==