LyoKICogIE5vdGVwYWQgKFdhbG9uIHJlc291cmNlcykKICoKICogIENvcHlyaWdodCAxOTk3LDk4IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KICogIFByb29mcmVhZCAxOTk4IGJ5IERhdmlkIExlZSBMYW1iZXJ0IDxsYW1iZXI0NUBlZ3IubXN1LmVkdT4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpNQUlOX01FTlUgTUVOVSBMQU5HVUFHRSBMQU5HX1dBTE9OLCBTVUJMQU5HX05FVVRSQUwKewogUE9QVVAgIiZGaXRjaO4iIHsKICBNRU5VSVRFTSAiJk5vdmVhLi4uIiwgMHgxMDAKICBNRU5VSVRFTSAiJkRyb3buIiwgMHgxMDEKICBNRU5VSVRFTSAiJlNjaGFwZXIiLCAweDEwMgogIE1FTlVJVEVNICJTY2hhcGVyIOh0IHImbG9tZXIuLi4iLCAweDEwMwogIE1FTlVJVEVNICImUmV4aGUiLCAweDEwNAogIE1FTlVJVEVNICJBcnJhbmRqbWludCBkZWwgJlDlZGplLi4uIiwgMHgxMDUKICBNRU5VSVRFTSAiJkFwb250aWFlZGplIGRlbCBzY3JpcmVjZS4uLiIsIDB4MTA2CiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIk1vdXNz7iAmRm/7IiwgMHgxMDgKIH0KUE9QVVAgIiZDYW5kau4iIHsKICBNRU5VSVRFTSAiJkRpc2bpXHRDdHJsK1oiLCAweDExMAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJD9CZwZXJcdEN0cmwrWCIsIDB4MTExCiAgTUVOVUlURU0gIiZDb3B57lx0Q3RybCtDIiwgMHgxMTIKICBNRU5VSVRFTSAiQyZsYXBlclx0Q3RybCtWIiwgMHgxMTMKICBNRU5VSVRFTSAiJlJhZmFjZXJcdERlbCIsIDB4MTE0CiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZUY2h3ZXppIHRvdGFmd2FpdCIsIDB4MTE2CiAgTUVOVUlURU0gIiZFdXJlL0RhdGVcdEY1IiwgMHgxMTcKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQ/RwZXIgbGVzIHJvJnllcyIsIDB4MTE5CiB9ClBPUFVQICJDJndlcu4iIHsKICBNRU5VSVRFTSAiQ3dlcu4uLi4iLCAweDEyMAogIE1FTlVJVEVNICImU2j7dmFudFx0RjMiLCAweDEyMQogfQpQT1BVUCAiJkFpZGUiIHsKICBNRU5VSVRFTSAixSZkdmlucyIsIDB4MTMwCiAgTUVOVUlURU0gIkMmd2Vy7i4uLiIsIDB4MTMxCiAgTUVOVUlURU0gIiZBaWRlIHNvIGwnIEFpZGUiLCAweDEzMgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICImSW5mb3Jt5WNpb24uLi4iIHsKICAgTUVOVUlURU0gIiZMaWNpbnNlIiwgMHgxMzUKICAgTUVOVUlURU0gIiZOT0xFIFdBUkFOVEVZRSIsIDB4MTM2CiAgIE1FTlVJVEVNICLFICZkZmFpdCBkaSBXaW5lIiwgMHgxMzcKICB9CiB9Cn0gCgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQXyBESUFMT0cgMCwgMCwgMjI1LCA5NQpMQU5HVUFHRSBMQU5HX1dBTE9OLCBTVUJMQU5HX05FVVRSQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIkhlbHYiCkNBUFRJT04gIkFyaW5kam1pbnQgZGVsIFDlZGplIgp7CkxURVhUICAgICImVGl0ZToiLCAgMHgxNDAsICAgMTAsIDA3LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDEsICAgICAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUO5ub3RlOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MywgICAgICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICImTWFyZGplczoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZIaW50Y2hlOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwqLyAgIDB4MTQ3LCAgICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImQ29wZXRlOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRHJvZXRlOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCovICAweDE0RCwgICAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImQmFzOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsKi8gMHgxNTAsICAgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJJIFZhIiwgICAgICAgICAweDE1MSwgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIlJpbm9uY+4iLCAgICAgMHgxNTIsICAgICAgICAgICAgICAgMTgwLCAyMSwgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIiZBaWRlIiwgICAgICAgMHgxNTMsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX1dBTE9OLCBTVUJMQU5HX05FVVRSQUwKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLAkiJm4iICAgICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLAkiUOVkamUgJnMiICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsCQkiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsCSIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsCQkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLAkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwoKU1RSSU5HX05PVEVQQUQsCQkJCQkiTm90ZXBhZCIKU1RSSU5HX0VSUk9SLAkJCQkJIkFST0tFIgpTVFJJTkdfV0FSTklORywJCQkJCSJBRFZFUlRJWEhNSU5UIgpTVFJJTkdfSU5GTywJCQkJCSJJbmZvcm3lY2lvbiIKClNUUklOR19VTlRJVExFRCwJCQkJIihzaW4gdGl0ZSkiCgpTVFJJTkdfQUxMX0ZJTEVTLAkJCQkiVG9zIGxlcyBmaXRjaO5zICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsCQkJIkZpdGNo7nMgdGVrc2UgKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwJCQkJIkxpIGZpdGNo7iAnJXMnIGVzdCB0cm9wIGdyb3MgcG9sIG5vdGVwYWQuXG4gXApFcGxveW96IG9uIPR0ZSBhc3BvdWduZXUgZGkgdGVrc2UuIgpTVFJJTkdfTk9URVhULAkJCQkJIlZvcyBuJyBhdm96IHLpbiBzaWNy7nQuIFwKXG5UYXBleiBlbmUgc2Fjd2Ug6HQgcmFzYXlleiIKU1RSSU5HX0RPRVNOT1RFWElTVCwJCQkJIkZpbGUgJyVzJ1xuZG9lcyBub3QgZXhpc3RcblxuIFwKRG8geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGZpbGUgPyIKU1RSSU5HX05PVFNBVkVELAkJCQkiTGkgZml0Y2juICclcydcbmEgY2FuZGruXG5cbiBcCkVsIHZvbG96IHNjaGFwZXIgPyIKU1RSSU5HX05PVEZPVU5ELAkJCQkJIiclcycgcG91dCBu6W4gZXNzZSB0cm926S4iClNUUklOR19PVVRfT0ZfTUVNT1JZLAkJCSJMaSBtZW13ZXJlIGVzdCBwbGlubmUuIFxuXApDbG95b3ogb24gcHJvZ3JhbWUgb3UgcHVzIHBvIG1vbnRlciBsaSBtZW13ZXJlIGxpYmUuIgoKfQoK