LyoKICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqIEhhY2tlZCBmb3IgdGhlIEh5bW9kIGJvYXJkIGJ5IE11cnJheS5KZW5zZW5AY21zdC5jc2lyby5hdSwgMjAtT2N0LTAwCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8bXBjODI2MC5oPgojaW5jbHVkZSA8aW9wb3J0cy5oPgojaW5jbHVkZSA8aTJjLmg+CiNpbmNsdWRlIDxhc20vaW9waW5fODI2MC5oPgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogaW1wb3J0cyBmcm9tIGVlcHJvbS5jICovCmV4dGVybiBpbnQgZWVwcm9tX2xvYWQgKHVuc2lnbmVkLCBoeW1vZF9lZXByb21fdCAqKTsKZXh0ZXJuIGludCBlZXByb21fZmV0Y2ggKHVuc2lnbmVkLCBjaGFyICosIHVsb25nKTsKZXh0ZXJuIHZvaWQgZWVwcm9tX3ByaW50IChoeW1vZF9lZXByb21fdCAqKTsKCi8qIGltcG9ydHMgZnJvbSBmZXRjaC5jICovCmV4dGVybiBpbnQgZmV0Y2hfYW5kX3BhcnNlIChjaGFyICosIHVsb25nLCBpbnQgKCopKHVjaGFyICosIHVjaGFyICopKTsKCi8qIGltcG9ydHMgZnJvbSBjb21tb24vbWFpbi5jICovCmV4dGVybiBjaGFyIGNvbnNvbGVfYnVmZmVyW0NGR19DQlNJWkVdOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogSS9PIFBvcnQgY29uZmlndXJhdGlvbiB0YWJsZQogKgogKiBpZiBjb25mIGlzIDEsIHRoZW4gdGhhdCBwb3J0IHBpbiB3aWxsIGJlIGNvbmZpZ3VyZWQgYXQgYm9vdCB0aW1lCiAqIGFjY29yZGluZyB0byB0aGUgZml2ZSB2YWx1ZXMgcG9kci9wZGlyL3BwYXIvcHNvci9wZGF0IGZvciB0aGF0IGVudHJ5CiAqLwoKY29uc3QgaW9wX2NvbmZfdCBpb3BfY29uZl90YWJbNF1bMzJdID0gewoKCS8qIFBvcnQgQSBjb25maWd1cmF0aW9uICovCgl7CQkJCQkJCS8qICAgICAgICBjb25mIHBwYXIgcHNvciBwZGlyIHBvZHIgcGRhdCAqLwoJCQkJCQkJCQkvKiBQQTMxICovIHsxLCAxLCAxLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMSBNSUkgQ09MICovCgkJCQkJCQkJCS8qIFBBMzAgKi8gezEsIDEsIDEsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MxIE1JSSBDUlMgKi8KCQkJCQkJCQkJLyogUEEyOSAqLyB7MSwgMSwgMSwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzEgTUlJIFRYX0VSICovCgkJCQkJCQkJCS8qIFBBMjggKi8gezEsIDEsIDEsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MxIE1JSSBUWF9FTiAqLwoJCQkJCQkJCQkvKiBQQTI3ICovIHsxLCAxLCAxLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMSBNSUkgUlhfRFYgKi8KCQkJCQkJCQkJLyogUEEyNiAqLyB7MSwgMSwgMSwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzEgTUlJIFJYX0VSICovCgkJCQkJCQkJCS8qIFBBMjUgKi8gezEsIDAsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MyIE1JSSBNRElPICovCgkJCQkJCQkJCS8qIFBBMjQgKi8gezEsIDAsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MyIE1JSSBNREMgKi8KCQkJCQkJCQkJLyogUEEyMyAqLyB7MSwgMCwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzMgTUlJIE1ESU8gKi8KCQkJCQkJCQkJLyogUEEyMiAqLyB7MSwgMCwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzMgTUlJIE1EQyAqLwoJCQkJCQkJCQkvKiBQQTIxICovIHsxLCAxLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMSBNSUkgVHhEWzNdICovCgkJCQkJCQkJCS8qIFBBMjAgKi8gezEsIDEsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MxIE1JSSBUeERbMl0gKi8KCQkJCQkJCQkJLyogUEExOSAqLyB7MSwgMSwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzEgTUlJIFR4RFsxXSAqLwoJCQkJCQkJCQkvKiBQQTE4ICovIHsxLCAxLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMSBNSUkgVHhEWzBdICovCgkJCQkJCQkJCS8qIFBBMTcgKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MxIE1JSSBSeERbM10gKi8KCQkJCQkJCQkJLyogUEExNiAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzEgTUlJIFJ4RFsyXSAqLwoJCQkJCQkJCQkvKiBQQTE1ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMSBNSUkgUnhEWzFdICovCgkJCQkJCQkJCS8qIFBBMTQgKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MxIE1JSSBSeERbMF0gKi8KCQkJCQkJCQkJLyogUEExMyAqLyB7MSwgMCwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzEgTUlJIE1ESU8gKi8KCQkJCQkJCQkJLyogUEExMiAqLyB7MSwgMCwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzEgTUlJIE1EQyAqLwoJCQkJCQkJCQkvKiBQQTExICovIHsxLCAwLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogU0VMX0NEICovCgkJCQkJCQkJCS8qIFBBMTAgKi8gezEsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGTEFTSCBTVFMxICovCgkJCQkJCQkJCS8qIFBBOSAgKi8gezEsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGTEFTSCBTVFMwICovCgkJCQkJCQkJCS8qIFBBOCAgKi8gezEsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGTEFTSCB+UEUgKi8KCQkJCQkJCQkJLyogUEE3ICAqLyB7MSwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFdBVENIIH5IUkVTRVQgKi8KCQkJCQkJCQkJLyogUEE2ICAqLyB7MSwgMCwgMCwgMCwgMSwgMH0sCgkJCQkJCQkJCS8qIFZDIERPTkUgKi8KCQkJCQkJCQkJLyogUEE1ICAqLyB7MSwgMCwgMCwgMSwgMSwgMH0sCgkJCQkJCQkJCS8qIFZDIElOSVQgKi8KCQkJCQkJCQkJLyogUEE0ICAqLyB7MSwgMCwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIFZDIH5QUk9HICovCgkJCQkJCQkJCS8qIFBBMyAgKi8gezEsIDAsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBWTSBFTkFCTEUgKi8KCQkJCQkJCQkJLyogUEEyICAqLyB7MSwgMCwgMCwgMCwgMSwgMH0sCgkJCQkJCQkJCS8qIFZNIERPTkUgKi8KCQkJCQkJCQkJLyogUEExICAqLyB7MSwgMCwgMCwgMSwgMSwgMH0sCgkJCQkJCQkJCS8qIFZNIElOSVQgKi8KCQkJCQkJCQkJLyogUEEwICAqLyB7MSwgMCwgMCwgMSwgMCwgMH0KCQkJCQkJCQkJLyogVk0gflBST0cgKi8KCSB9LAoKCS8qIFBvcnQgQiBjb25maWd1cmF0aW9uICovCgl7CQkJCQkJCS8qICAgICAgICBjb25mIHBwYXIgcHNvciBwZGlyIHBvZHIgcGRhdCAqLwoJCQkJCQkJCQkvKiBQQjMxICovIHsxLCAxLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMiBNSUkgVFhfRVIgKi8KCQkJCQkJCQkJLyogUEIzMCAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzIgTUlJIFJYX0RWICovCgkJCQkJCQkJCS8qIFBCMjkgKi8gezEsIDEsIDEsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MyIE1JSSBUWF9FTiAqLwoJCQkJCQkJCQkvKiBQQjI4ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMiBNSUkgUlhfRVIgKi8KCQkJCQkJCQkJLyogUEIyNyAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzIgTUlJIENPTCAqLwoJCQkJCQkJCQkvKiBQQjI2ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMiBNSUkgQ1JTICovCgkJCQkJCQkJCS8qIFBCMjUgKi8gezEsIDEsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MyIE1JSSBUeERbM10gKi8KCQkJCQkJCQkJLyogUEIyNCAqLyB7MSwgMSwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzIgTUlJIFR4RFsyXSAqLwoJCQkJCQkJCQkvKiBQQjIzICovIHsxLCAxLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMiBNSUkgVHhEWzFdICovCgkJCQkJCQkJCS8qIFBCMjIgKi8gezEsIDEsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MyIE1JSSBUeERbMF0gKi8KCQkJCQkJCQkJLyogUEIyMSAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzIgTUlJIFJ4RFswXSAqLwoJCQkJCQkJCQkvKiBQQjIwICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMiBNSUkgUnhEWzFdICovCgkJCQkJCQkJCS8qIFBCMTkgKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MyIE1JSSBSeERbMl0gKi8KCQkJCQkJCQkJLyogUEIxOCAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzIgTUlJIFJ4RFszXSAqLwoJCQkJCQkJCQkvKiBQQjE3ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMyBNSUkgUlhfRFYgKi8KCQkJCQkJCQkJLyogUEIxNiAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzMgTUlJIFJYX0VSICovCgkJCQkJCQkJCS8qIFBCMTUgKi8gezEsIDEsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MzIE1JSSBUWF9FUiAqLwoJCQkJCQkJCQkvKiBQQjE0ICovIHsxLCAxLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMyBNSUkgVFhfRU4gKi8KCQkJCQkJCQkJLyogUEIxMyAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzMgTUlJIENPTCAqLwoJCQkJCQkJCQkvKiBQQjEyICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMyBNSUkgQ1JTICovCgkJCQkJCQkJCS8qIFBCMTEgKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MzIE1JSSBSeERbM10gKi8KCQkJCQkJCQkJLyogUEIxMCAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzMgTUlJIFJ4RFsyXSAqLwoJCQkJCQkJCQkvKiBQQjkgICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMyBNSUkgUnhEWzFdICovCgkJCQkJCQkJCS8qIFBCOCAgKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MzIE1JSSBSeERbMF0gKi8KCQkJCQkJCQkJLyogUEI3ICAqLyB7MSwgMSwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzMgTUlJIFR4RFszXSAqLwoJCQkJCQkJCQkvKiBQQjYgICovIHsxLCAxLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMyBNSUkgVHhEWzJdICovCgkJCQkJCQkJCS8qIFBCNSAgKi8gezEsIDEsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MzIE1JSSBUeERbMV0gKi8KCQkJCQkJCQkJLyogUEI0ICAqLyB7MSwgMSwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzMgTUlJIFR4RFswXSAqLwoJCQkJCQkJCQkvKiBQQjMgICovIHswLCAwLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQkJCQkJCQkJLyogUEIyICAqLyB7MCwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCgkJCQkJCQkJCS8qIFBCMSAgKi8gezAsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCQkJCQkJCQkvKiBQQjAgICovIHswLCAwLCAwLCAwLCAwLCAwfQoJCQkJCQkJCQkvKiBwaW4gZG9lc24ndCBleGlzdCAqLwoJIH0sCgoJLyogUG9ydCBDICovCgl7CQkJCQkJCS8qICAgICAgICBjb25mIHBwYXIgcHNvciBwZGlyIHBvZHIgcGRhdCAqLwoJCQkJCQkJCQkvKiBQQzMxICovIHsxLCAwLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogTUVaIH5JQUNLICovCgkgLyogUEMzMCAqLyB7MCwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFBDMjkgKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBDTEsgU0NDeCAqLwoJCQkJCQkJCQkvKiBQQzI4ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogQ0xLNCAqLwoJCQkJCQkJCQkvKiBQQzI3ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogQ0xLIFNDQ0YgKi8KCQkJCQkJCQkJLyogUEMyNiAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIENMSyAzMksgKi8KCQkJCQkJCQkJLyogUEMyNSAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEJSRzQvQ0xLNyAqLwoJIC8qIFBDMjQgKi8gezAsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBQQzIzICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogQ0xLIFNDQ3ggKi8KCQkJCQkJCQkJLyogUEMyMiAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzEgTUlJIFJYX0NMSyAqLwoJCQkJCQkJCQkvKiBQQzIxICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMSBNSUkgVFhfQ0xLICovCgkJCQkJCQkJCS8qIFBDMjAgKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBDTEsgU0NDRiAqLwoJCQkJCQkJCQkvKiBQQzE5ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMiBNSUkgUlhfQ0xLICovCgkJCQkJCQkJCS8qIFBDMTggKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MyIE1JSSBUWF9DTEsgKi8KCQkJCQkJCQkJLyogUEMxNyAqLyB7MSwgMSwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzMgTUlJIFJYX0NMSyAqLwoJCQkJCQkJCQkvKiBQQzE2ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMyBNSUkgVFhfQ0xLICovCgkJCQkJCQkJCS8qIFBDMTUgKi8gezEsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBTQ0MxIFVBUlQgfkNUUyAqLwoJCQkJCQkJCQkvKiBQQzE0ICovIHsxLCAwLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogU0NDMSBVQVJUIH5DRCAqLwoJCQkJCQkJCQkvKiBQQzEzICovIHsxLCAwLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogU0NDMiBVQVJUIH5DVFMgKi8KCQkJCQkJCQkJLyogUEMxMiAqLyB7MSwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFNDQzIgVUFSVCB+Q0QgKi8KCQkJCQkJCQkJLyogUEMxMSAqLyB7MSwgMCwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIFNDQzEgVUFSVCB+RFRSICovCgkJCQkJCQkJCS8qIFBDMTAgKi8gezEsIDAsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBTQ0MxIFVBUlQgfkRTUiAqLwoJCQkJCQkJCQkvKiBQQzkgICovIHsxLCAwLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogU0NDMiBVQVJUIH5EVFIgKi8KCQkJCQkJCQkJLyogUEM4ICAqLyB7MSwgMCwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIFNDQzIgVUFSVCB+RFNSICovCgkJCQkJCQkJCS8qIFBDNyAgKi8gezEsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBURU1QIH5BTEVSVCAqLwoJCQkJCQkJCQkvKiBQQzYgICovIHsxLCAwLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogRkNDMyBJTlQgKi8KCQkJCQkJCQkJLyogUEM1ICAqLyB7MSwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIEZDQzIgSU5UICovCgkJCQkJCQkJCS8qIFBDNCAgKi8gezEsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBGQ0MxIElOVCAqLwoJCQkJCQkJCQkvKiBQQzMgICovIHsxLCAxLCAxLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogU0RNQSBJRE1BMiB+REFDSyAqLwoJCQkJCQkJCQkvKiBQQzIgICovIHsxLCAxLCAxLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogU0RNQSBJRE1BMiB+RE9ORSAqLwoJCQkJCQkJCQkvKiBQQzEgICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogU0RNQSBJRE1BMiB+RFJFUSAqLwoJCQkJCQkJCQkvKiBQQzAgICovIHsxLCAxLCAwLCAxLCAwLCAwfQoJCQkJCQkJCQkvKiBCUkc3ICovCgkgfSwKCgkvKiBQb3J0IEQgKi8KCXsJCQkJCQkJLyogICAgICAgIGNvbmYgcHBhciBwc29yIHBkaXIgcG9kciBwZGF0ICovCgkJCQkJCQkJCS8qIFBEMzEgKi8gezEsIDEsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBTQ0MxIFVBUlQgUnhEICovCgkJCQkJCQkJCS8qIFBEMzAgKi8gezEsIDEsIDEsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBTQ0MxIFVBUlQgVHhEICovCgkJCQkJCQkJCS8qIFBEMjkgKi8gezEsIDAsIDAsIDEsIDAsIDB9LAoJCQkJCQkJCQkvKiBTQ0MxIFVBUlQgflJUUyAqLwoJCQkJCQkJCQkvKiBQRDI4ICovIHsxLCAxLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogU0NDMiBVQVJUIFJ4RCAqLwoJCQkJCQkJCQkvKiBQRDI3ICovIHsxLCAxLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogU0NDMiBVQVJUIFR4RCAqLwoJCQkJCQkJCQkvKiBQRDI2ICovIHsxLCAwLCAwLCAxLCAwLCAwfSwKCQkJCQkJCQkJLyogU0NDMiBVQVJUIH5SVFMgKi8KCQkJCQkJCQkJLyogUEQyNSAqLyB7MSwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFNDQzEgVUFSVCB+UkkgKi8KCQkJCQkJCQkJLyogUEQyNCAqLyB7MSwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFNDQzIgVUFSVCB+UkkgKi8KCQkJCQkJCQkJLyogUEQyMyAqLyB7MSwgMCwgMCwgMSwgMCwgMH0sCgkJCQkJCQkJCS8qIENMS0dFTiBQRCAqLwoJCQkJCQkJCQkvKiBQRDIyICovIHsxLCAwLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogVVNFUjMgKi8KCQkJCQkJCQkJLyogUEQyMSAqLyB7MSwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFVTRVIyICovCgkJCQkJCQkJCS8qIFBEMjAgKi8gezEsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBVU0VSMSAqLwoJCQkJCQkJCQkvKiBQRDE5ICovIHsxLCAxLCAxLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogU1BJIH5TRUwgKi8KCQkJCQkJCQkJLyogUEQxOCAqLyB7MSwgMSwgMSwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFNQSSBDTEsgKi8KCQkJCQkJCQkJLyogUEQxNyAqLyB7MSwgMSwgMSwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFNQSSBNT1NJICovCgkJCQkJCQkJCS8qIFBEMTYgKi8gezEsIDEsIDEsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBTUEkgTUlTTyAqLwoJCQkJCQkJCQkvKiBQRDE1ICovIHsxLCAxLCAxLCAwLCAxLCAwfSwKCQkJCQkJCQkJLyogSTJDIFNEQSAqLwoJCQkJCQkJCQkvKiBQRDE0ICovIHsxLCAxLCAxLCAwLCAxLCAwfSwKCQkJCQkJCQkJLyogSTJDIFNDTCAqLwoJCQkJCQkJCQkvKiBQRDEzICovIHsxLCAwLCAwLCAxLCAwLCAxfSwKCQkJCQkJCQkJLyogVEVNUCB+U1REQlkgKi8KCQkJCQkJCQkJLyogUEQxMiAqLyB7MSwgMCwgMCwgMSwgMCwgMX0sCgkJCQkJCQkJCS8qIEZDQzMgflJFU0VUICovCgkJCQkJCQkJCS8qIFBEMTEgKi8gezEsIDAsIDAsIDEsIDAsIDF9LAoJCQkJCQkJCQkvKiBGQ0MyIH5SRVNFVCAqLwoJCQkJCQkJCQkvKiBQRDEwICovIHsxLCAwLCAwLCAxLCAwLCAxfSwKCQkJCQkJCQkJLyogRkNDMSB+UkVTRVQgKi8KCQkJCQkJCQkJLyogUEQ5ICAqLyB7MSwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIFBEOSAqLwoJCQkJCQkJCQkvKiBQRDggICovIHsxLCAwLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogUEQ4ICovCgkJCQkJCQkJCS8qIFBENyAgKi8gezEsIDAsIDAsIDEsIDAsIDF9LAoJCQkJCQkJCQkvKiBQRDcgKi8KCQkJCQkJCQkJLyogUEQ2ICAqLyB7MSwgMCwgMCwgMSwgMCwgMX0sCgkJCQkJCQkJCS8qIFBENiAqLwoJCQkJCQkJCQkvKiBQRDUgICovIHsxLCAwLCAwLCAxLCAwLCAxfSwKCQkJCQkJCQkJLyogUEQ1ICovCgkJCQkJCQkJCS8qIFBENCAgKi8gezEsIDAsIDAsIDEsIDAsIDF9LAoJCQkJCQkJCQkvKiBQRDQgKi8KCQkJCQkJCQkJLyogUEQzICAqLyB7MCwgMCwgMCwgMCwgMCwgMH0sCgkJCQkJCQkJCS8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCgkJCQkJCQkJCS8qIFBEMiAgKi8gezAsIDAsIDAsIDAsIDAsIDB9LAoJCQkJCQkJCQkvKiBwaW4gZG9lc24ndCBleGlzdCAqLwoJCQkJCQkJCQkvKiBQRDEgICovIHswLCAwLCAwLCAwLCAwLCAwfSwKCQkJCQkJCQkJLyogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCQkJCQkJCQkJLyogUEQwICAqLyB7MCwgMCwgMCwgMCwgMCwgMH0KCQkJCQkJCQkJLyogcGluIGRvZXNuJ3QgZXhpc3QgKi8KCSB9Cn07CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBBTUkgRlM2Mzc3IENsb2NrIEdlbmVyYXRvciBjb25maWd1cmF0aW9uIHRhYmxlCiAqCiAqIHRoZSAiZnM2Mzc3X3JlZ3NbXSIgdGFibGUgZW50cmllcyBjb3JyZXNwb25kIHRvIEZTNjM3NyByZWdpc3RlcnMKICogMCAtIDE1ICh0b3RhbCBvZiAxNiBieXRlcykuCiAqCiAqIHRoZSBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIEZTNjM3NyB2aWEgdGhlIGkyYyBidXMgdXNpbmcgYWRkcmVzcyBpbgogKiAiZnM2Mzc3X2FkZHIiIChhZGRyZXNzIGlzIDcgYml0cyAtIFIvVyBiaXQgbm90IGluY2x1ZGVkKS4KICovCgp1Y2hhciBmczYzNzdfYWRkciA9IDB4NWM7Cgp1Y2hhciBmczYzNzdfcmVnc1sxNl0gPSB7CgkxMiwgNzUsIDY0LCAyNSwgMTQ0LCAxMjgsIDI1LCAxOTIsCgkwLCAxNiwgMTM1LCAxOTIsIDIyNCwgNjQsIDY0LCAxOTIKfTsKCmlvcGluX3QgcGExMSA9IHsgSU9QSU5fUE9SVEEsIDExLCAwIH07CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBzcGVjaWFsIGJvYXJkIGluaXRpYWxpc2F0aW9uLCBhZnRlciBjbG9ja3MgYW5kIHRpbWViYXNlIGhhdmUgYmVlbgogKiBzZXQgdXAgYnV0IGJlZm9yZSBlbnZpcm9ubWVudCBhbmQgc2VyaWFsIGFyZSBpbml0aWFsaXNlZC4KICoKICogYWRkZWQgc28gdGhhdCB2ZXJ5IGVhcmx5IGluaXRpYWxpc2F0aW9ucyBjYW4gYmUgZG9uZSB1c2luZyB0aGUgaTJjCiAqIGRyaXZlciAod2hpY2ggcmVxdWlyZXMgdGhlIGNsb2NrcywgdG8gY2FsY3VsYXRlIHRoZSBkaXZpZGVycywgYW5kCiAqIHRoZSB0aW1lYmFzZSwgZm9yIHVkZWxheSgpKQogKi8KCmludCBib2FyZF9wb3N0Y2xrX2luaXQgKHZvaWQpCnsKCWkyY19pbml0IChDRkdfSTJDX1NQRUVELCBDRkdfSTJDX1NMQVZFKTsKCgkvKgoJICogSW5pdGlhbGlzZSB0aGUgRlM2Mzc3IGNsb2NrIGNoaXAKCSAqCgkgKiB0aGUgc2Vjb25kYXJ5IGFkZHJlc3MgaXMgdGhlIHJlZ2lzdGVyIG51bWJlciBmcm9tIHdoZXJlIHRvCgkgKiBzdGFydCB0aGUgd3JpdGUgLSBJIHdhbnQgdG8gd3JpdGUgYWxsIHRoZSByZWdpc3RlcnMKCSAqCgkgKiBkb24ndCBib3RoZXIgY2hlY2tpbmcgcmV0dXJuIHN0YXR1cyAtIHdlIGhhdmUgbm8gY29uc29sZSB5ZXQKCSAqIHRvIHByaW50IGl0IG9uLCBub3IgYW55IFJBTSB0byBzdG9yZSBpdCBpbiAtIGl0IHdpbGwgYmUgb2J2aW91cwoJICogaWYgdGhpcyBkb2Vzbid0IHdvcmsKCSAqLwoJKHZvaWQpIGkyY193cml0ZSAoZnM2Mzc3X2FkZHIsIDAsIDEsIGZzNjM3N19yZWdzLAoJCQkJCSAgc2l6ZW9mIChmczYzNzdfcmVncykpOwoKCXJldHVybiAoMCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIENoZWNrIEJvYXJkIElkZW50aXR5OiBIYXJkd2lyZWQgdG8gSFlNT0QKICovCgppbnQgY2hlY2tib2FyZCAodm9pZCkKewoJcHV0cyAoIkJvYXJkOiBIWU1PRFxuIik7CglyZXR1cm4gKDApOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiBtaXNjZWxsYW5lb3VzIChlYXJseSAtIHdoaWxlIHJ1bm5pbmcgaW4gZmxhc2gpIGluaXRpYWxpc2F0aW9ucy4KICovCgojZGVmaW5lIF9OT1RfVVNFRF8JMHhGRkZGRkZGRgoKdWludCB1cG1iX3RhYmxlW10gPSB7CgkvKiBSZWFkIFNpbmdsZSBCZWF0IChSU1MpIC0gb2Zmc2V0IDB4MDAgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogUmVhZCBCdXJzdCAoUkJTKSAtIG9mZnNldCAweDA4ICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogV3JpdGUgU2luZ2xlIEJlYXQgKFdTUykgLSBvZmZzZXQgMHgxOCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBXcml0ZSBCdXJzdCAoV1NTKSAtIG9mZnNldCAweDIwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogUmVmcmVzaCBUaW1lciAoUFRTKSAtIG9mZnNldCAweDMwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCgkvKiBFeGNlcHRpb24gQ29uZGl0aW9uIChFWFMpIC0gb2Zmc2V0IDB4M2MgKi8KCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8KfTsKCnVpbnQgdXBtY190YWJsZVtdID0gewoJLyogUmVhZCBTaW5nbGUgQmVhdCAoUlNTKSAtIG9mZnNldCAweDAwICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFJlYWQgQnVyc3QgKFJCUykgLSBvZmZzZXQgMHgwOCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFdyaXRlIFNpbmdsZSBCZWF0IChXU1MpIC0gb2Zmc2V0IDB4MTggKi8KCTB4RjBFMDAwMDAsIDB4RjBBMDAwMDAsIDB4MDBBMDAwMDAsIDB4MzBBMDAwMDAsCgkweEYwRjQwMDA3LCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogV3JpdGUgQnVyc3QgKFdTUykgLSBvZmZzZXQgMHgyMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCS8qIFJlZnJlc2ggVGltZXIgKFBUUykgLSBvZmZzZXQgMHgzMCAqLwoJX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywgX05PVF9VU0VEXywKCV9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sIF9OT1RfVVNFRF8sCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLAoJLyogRXhjZXB0aW9uIENvbmRpdGlvbiAoRVhTKSAtIG9mZnNldCAweDNjICovCglfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfLCBfTk9UX1VTRURfCn07CgppbnQgbWlzY19pbml0X2YgKHZvaWQpCnsKCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Cgl2b2xhdGlsZSBtZW1jdGw4MjYwX3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOwoKCXByaW50ZiAoIlVQTXM6ICAiKTsKCgl1cG1jb25maWcgKFVQTUIsIHVwbWJfdGFibGUsIHNpemVvZiB1cG1iX3RhYmxlIC8gc2l6ZW9mIHVwbWJfdGFibGVbMF0pOwoJbWVtY3RsLT5tZW1jX21ibXIgPSBDRkdfTUJNUjsKCgl1cG1jb25maWcgKFVQTUMsIHVwbWNfdGFibGUsIHNpemVvZiB1cG1jX3RhYmxlIC8gc2l6ZW9mIHVwbWNfdGFibGVbMF0pOwoJbWVtY3RsLT5tZW1jX21jbXIgPSBDRkdfTUNNUjsKCglwcmludGYgKCJjb25maWd1cmVkXG4iKTsKCXJldHVybiAoMCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmxvbmcgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQp7Cgl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19JTU1SOwoJdm9sYXRpbGUgbWVtY3RsODI2MF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKCXZvbGF0aWxlIHVjaGFyIGMgPSAwLCAqcmFtYWRkciA9ICh1Y2hhciAqKSAoQ0ZHX1NEUkFNX0JBU0UgKyAweDgpOwoJdWxvbmcgcHNkbXIgPSBDRkdfUFNETVI7CglpbnQgaTsKCgkvKgoJICogUXVvdGUgZnJvbSA4MjYwIFVNICgxMC40LjIgU0RSQU0gUG93ZXItT24gSW5pdGlhbGl6YXRpb24sIDEwLTM1KToKCSAqCgkgKiAiQXQgc3lzdGVtIHJlc2V0LCBpbml0aWFsaXphdGlvbiBzb2Z0d2FyZSBtdXN0IHNldCB1cCB0aGUKCSAqICBwcm9ncmFtbWFibGUgcGFyYW1ldGVycyBpbiB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgYmFua3MgcmVnaXN0ZXJzCgkgKiAgKE9SeCwgQlJ4LCBQL0xTRE1SKS4gQWZ0ZXIgYWxsIG1lbW9yeSBwYXJhbWV0ZXJzIGFyZSBjb27eZ3VyZWQsCgkgKiAgc3lzdGVtIHNvZnR3YXJlIHNob3VsZCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UKCSAqICBmb3IgZWFjaCBTRFJBTSBkZXZpY2UuCgkgKgoJICogIDEuIElzc3VlIGEgUFJFQ0hBUkdFLUFMTC1CQU5LUyBjb21tYW5kCgkgKiAgMi4gSXNzdWUgZWlnaHQgQ0JSIFJFRlJFU0ggY29tbWFuZHMKCSAqICAzLiBJc3N1ZSBhIE1PREUtU0VUIGNvbW1hbmQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZSByZWdpc3RlcgoJICoKCSAqICBUaGUgaW5pdGlhbCBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgYnkgc2V0dGluZyBQL0xTRE1SW09QXSBhbmQKCSAqICBhY2Nlc3NpbmcgdGhlIFNEUkFNIHdpdGggYSBzaW5nbGUtYnl0ZSB0cmFuc2FjdGlvbi4iCgkgKgoJICogVGhlIGFwcHJvcHJpYXRlIEJSeC9PUnggcmVnaXN0ZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHNldCB3aGVuIHdlCgkgKiBnZXQgaGVyZS4gVGhlIFNEUkFNIGNhbiBiZSBhY2Nlc3NlZCBhdCB0aGUgYWRkcmVzcyBDRkdfU0RSQU1fQkFTRS4KCSAqLwoKCW1lbWN0bC0+bWVtY19wc3J0ID0gQ0ZHX1BTUlQ7CgltZW1jdGwtPm1lbWNfbXB0cHIgPSBDRkdfTVBUUFI7CgoJbWVtY3RsLT5tZW1jX3BzZG1yID0gcHNkbXIgfCBQU0RNUl9PUF9QUkVBOwoJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfQ0JSUjsKCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCgkJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfTVJXOwoJKnJhbWFkZHIgPSBjOwoKCW1lbWN0bC0+bWVtY19wc2RtciA9IHBzZG1yIHwgUFNETVJfT1BfTk9STSB8IFBTRE1SX1JGRU47CgkqcmFtYWRkciA9IGM7CgoJcmV0dXJuIChDRkdfU0RSQU1fU0laRSA8PCAyMCk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbWlzY2VsbGFuZW91cyBpbml0aWFsaXNhdGlvbnMgYWZ0ZXIgcmVsb2NhdGlvbiBpbnRvIHJhbSAobWlzY19pbml0X3IpICAgICAqLwovKiAJCQkJCQkJCQkgICAgICovCi8qIGxvYWRzIHRoZSBkYXRhIGluIHRoZSBtYWluIGJvYXJkIGFuZCBtZXp6YW5pbmUgYm9hcmQgZWVwcm9tcyBpbnRvCSAgICAgKi8KLyogdGhlIGh5bW9kIGNvbmZpZ3VyYXRpb24gc3RydWN0IHN0b3JlZCBpbiB0aGUgYm9hcmQgaW5mb3JtYXRpb24gYXJlYS4JICAgICAqLwovKiAJCQkJCQkJCQkgICAgICovCi8qIGlmIHRoZSBjb250ZW50cyBvZiBlaXRoZXIgZWVwcm9tIGlzIGludmFsaWQsIHByb21wdHMgZm9yIGEgc2VyaWFsCSAgICAgKi8KLyogbnVtYmVyIChhbmQgYW4gZXRoZXJuZXQgYWRkcmVzcyBpZiByZXF1aXJlZCkgdGhlbiBmZXRjaGVzIGEgZmlsZQkgICAgICovCi8qIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gdG8gYmUgc3RvcmVkIGluIHRoZSBlZXByb20gZnJvbSB0aGUgdGZ0cCBzZXJ2ZXIgICAgKi8KLyogKHRoZSBmaWxlIG5hbWUgaXMgYmFzZWQgb24gdGhlIHNlcmlhbCBudW1iZXIgYW5kIGEgYnVpbHQtaW4gcGF0aCkJICAgICAqLwoKLyogdGhlc2UgYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBzZXJ2ZXIncyB0ZnRwIGRpcmVjdG9yeSAqLwpzdGF0aWMgY2hhciAqYmRkYl9jZmdkaXIgPSAiL2h5bW9kL2JkZGIiOwpzdGF0aWMgY2hhciAqZ2xvYmFsX2Vudl9wYXRoID0gIi9oeW1vZC9nbG9iYWxfZW52IjsKCnN0YXRpYyB1bG9uZyBnZXRfc2Vybm8gKGNvbnN0IGNoYXIgKnByb21wdCkKewoJZm9yICg7OykgewoJCWludCBuOwoJCWNoYXIgKnA7CgkJdWxvbmcgc2Vybm87CgoJCW4gPSByZWFkbGluZSAocHJvbXB0KTsKCgkJaWYgKG4gPCAwKQoJCQlyZXR1cm4gKDApOwoKCQlpZiAobiA9PSAwKQoJCQljb250aW51ZTsKCgkJc2Vybm8gPSBzaW1wbGVfc3RydG9sIChjb25zb2xlX2J1ZmZlciwgJnAsIDEwKTsKCgkJaWYgKHAgPiBjb25zb2xlX2J1ZmZlciAmJiAqcCA9PSAnXDAnKQoJCQlyZXR1cm4gKHNlcm5vKTsKCgkJcHJpbnRmICgiSW52YWxpZCBudW1iZXIgKCVzKSAtIHBsZWFzZSByZS1lbnRlclxuIiwgY29uc29sZV9idWZmZXIpOwoJfQp9CgpzdGF0aWMgaW50IHJlYWRfZWVwcm9tIChjaGFyICpsYWJlbCwgdW5zaWduZWQgb2Zmc2V0LCBoeW1vZF9lZXByb21fdCAqIGVwKQp7CgljaGFyIGZpbGVuYW1lWzUwXSwgcHJvbXB0WzUwXTsKCXVsb25nIHNlcm5vOwoJaW50IGNvdW50ID0gMDsKCglzcHJpbnRmIChwcm9tcHQsICJFbnRlciAlcyBib2FyZCBzZXJpYWwgbnVtYmVyOiAiLCBsYWJlbCk7CgoJZm9yICg7OykgewoKCQlpZiAoZWVwcm9tX2xvYWQgKG9mZnNldCwgZXApKQoJCQlyZXR1cm4gKDEpOwoKCQlwcmludGYgKCIqKiogJXMgYm9hcmQgRUVQUk9NIGNvbnRlbnRzIGFyZSAlc2ludmFsaWRcbiIsCgkJCQlsYWJlbCwgY291bnQgPT0gMCA/ICIiIDogIlNUSUxMICIpOwoKCQlwdXRzICgiKioqIHdpbGwgYXR0ZW1wdCB0byBmZXRjaCBmcm9tIHNlcnZlciAoQ3RybC1DIHRvIGFib3J0KVxuIik7CgoJCWlmICgoc2Vybm8gPSBnZXRfc2Vybm8gKHByb21wdCkpID09IDApIHsKCQkJcHV0cyAoIlxuKioqIGludGVycnVwdGVkISAtIGlnbm9yaW5nIGVlcHJvbSBjb250ZW50c1xuIik7CgkJCXJldHVybiAoMCk7CgkJfQoKCQlzcHJpbnRmIChmaWxlbmFtZSwgIiVzLyUwMTBsdS5jZmciLCBiZGRiX2NmZ2Rpciwgc2Vybm8pOwoKCQlwcmludGYgKCIqKiogZmV0Y2hpbmcgJXMgYm9hcmQgRUVQUk9NIGNvbnRlbnRzIGZyb20gc2VydmVyXG4iLAoJCQkJbGFiZWwpOwoKCQlpZiAoZWVwcm9tX2ZldGNoIChvZmZzZXQsIGZpbGVuYW1lLCAweDEwMDAwMCkgPT0gMCkgewoJCQlwdXRzICgiKioqIGZldGNoIGZhaWxlZCAtIGlnbm9yaW5nIGVlcHJvbSBjb250ZW50c1xuIik7CgkJCXJldHVybiAoMCk7CgkJfQoKCQljb3VudCsrOwoJfQp9CgpzdGF0aWMgdWxvbmcgbWFpbl9zZXJubzsKCnN0YXRpYyBpbnQgZW52X2ZldGNoX2NhbGxiYWNrICh1Y2hhciAqIG5hbWUsIHVjaGFyICogdmFsdWUpCnsKCWNoYXIgKm92LCBudltDRkdfQ0JTSVpFXSwgKnAsICpxLCAqbm47CglpbnQgb3ZlcnJpZGUgPSAxLCBhcHBlbmQgPSAwLCBubDsKCglubiA9IG5hbWU7CglpZiAoKm5uID09ICctJykgewoJCW92ZXJyaWRlID0gMDsKCQlubisrOwoJfQoKCWlmICgobmwgPSBzdHJsZW4gKG5uKSkgPiAwICYmIG5uW25sIC0gMV0gPT0gJysnKSB7CgkJYXBwZW5kID0gMTsKCQlublstLW5sXSA9ICdcMCc7Cgl9CgoJcCA9IHZhbHVlOwoJcSA9IG52OwoKCXdoaWxlICgoKnEgPSAqcCsrKSAhPSAnXDAnKQoJCWlmICgqcSA9PSAnJScpIHsKCQkJc3dpdGNoICgqcCsrKSB7CgoJCQljYXNlICdcMCc6CQkJLyogd2hvb3BzIC0gYmFjayB1cCAqLwoJCQkJcC0tOwoJCQkJYnJlYWs7CgoJCQljYXNlICclJzoJCQkvKiBhIHNpbmdsZSBwZXJjZW50IGNoYXJhY3RlciAqLwoJCQkJcSsrOwoJCQkJYnJlYWs7CgoJCQljYXNlICdzJzoJCQkvKiBtYWluIGJvYXJkIHNlcmlhbCBudW1iZXIgYXMgc3RyaW5nICovCgkJCQlxICs9IHNwcmludGYgKHEsICIlMDEwbHUiLCBtYWluX3Nlcm5vKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnUyc6CQkJLyogbWFpbiBib2FyZCBzZXJpYWwgbnVtYmVyIGFzIG51bWJlciAqLwoJCQkJcSArPSBzcHJpbnRmIChxLCAiJWx1IiwgbWFpbl9zZXJubyk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CQkJLyogaWdub3JlIGFueSBvdGhlcnMgKi8KCQkJCWJyZWFrOwoJCQl9CgkJfSBlbHNlCgkJCXErKzsKCglpZiAoKG92ID0gZ2V0ZW52IChubikpICE9IE5VTEwpIHsKCgkJaWYgKGFwcGVuZCkgewoKCQkJaWYgKHN0cnN0ciAob3YsIG52KSA9PSBOVUxMKSB7CgkJCQlpbnQgb3ZsLCBudmw7CgoJCQkJcHJpbnRmICgiQXBwZW5kaW5nICclcycgdG8gZW52IGNtZCAnJXMnXG4iLCBudiwgbm4pOwoKCQkJCW92bCA9IHN0cmxlbiAob3YpOwoJCQkJbnZsID0gc3RybGVuIChudik7CgoJCQkJd2hpbGUgKG52bCA+PSAwKSB7CgkJCQkJbnZbb3ZsICsgMSArIG52bF0gPSBudltudmxdOwoJCQkJCW52bC0tOwoJCQkJfQoKCQkJCW52W292bF0gPSAnICc7CgoJCQkJd2hpbGUgKC0tb3ZsID49IDApCgkJCQkJbnZbb3ZsXSA9IG92W292bF07CgoJCQkJc2V0ZW52IChubiwgbnYpOwoJCQl9CgoJCQlyZXR1cm4gKDEpOwoJCX0KCgkJaWYgKCFvdmVycmlkZSB8fCBzdHJjbXAgKG92LCBudikgPT0gMCkKCQkJcmV0dXJuICgxKTsKCgkJcHJpbnRmICgiUmUtc2V0dGluZyBlbnYgY21kICclcycgZnJvbSAnJXMnIHRvICclcydcbiIsIG5uLCBvdiwgbnYpOwoJfSBlbHNlCgkJcHJpbnRmICgiU2V0dGluZyBlbnYgY21kICclcycgdG8gJyVzJ1xuIiwgbm4sIG52KTsKCglzZXRlbnYgKG5uLCBudik7CglyZXR1cm4gKDEpOwp9CgppbnQgbWlzY19pbml0X3IgKHZvaWQpCnsKCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKCWh5bW9kX2NvbmZfdCAqY3AgPSAmZ2QtPmJkLT5iaV9oeW1vZF9jb25mOwoJaW50IHJjOwoKCW1lbXNldCAoKHZvaWQgKikgY3AsIDAsIHNpemVvZiAoKmNwKSk7CgoJLyogc2V0IHVwIG1haW4gYm9hcmQgY29uZmlnIGluZm8gKi8KCglpZiAoaTJjX3Byb2JlIChDRkdfSTJDX0VFUFJPTV9BRERSIHwgSFlNT0RfRUVPRkZfTUFJTikpIHsKCgkJaWYgKHJlYWRfZWVwcm9tCgkJCSgibWFpbiIsIEhZTU9EX0VFT0ZGX01BSU4gPDwgOCwgJmNwLT5tYWluLmVlcHJvbSkpCgkJCWNwLT5tYWluLmVlcHJvbV92YWxpZCA9IDE7CgoJCXB1dHMgKCJFRVBST006bWFpbi4uLiIpOwoKCQlpZiAoY3AtPm1haW4uZWVwcm9tX3ZhbGlkKSB7CgkJCXByaW50ZiAoIk9LICh2ZXIgJXUpXG4iLCBjcC0+bWFpbi5lZXByb20udmVyKTsKCQkJZWVwcm9tX3ByaW50ICgmY3AtPm1haW4uZWVwcm9tKTsKCQkJbWFpbl9zZXJubyA9IGNwLT5tYWluLmVlcHJvbS5zZXJubzsKCQl9IGVsc2UKCQkJcHV0cyAoIkJBRFxuIik7CgoJCWNwLT5tYWluLm1tYXBbMF0ucHJvZy5leGlzdHMgPSAxOwoJCWNwLT5tYWluLm1tYXBbMF0ucHJvZy5zaXplID0gRlBHQV9NQUlOX0NGR19TSVpFOwoJCWNwLT5tYWluLm1tYXBbMF0ucHJvZy5iYXNlID0gRlBHQV9NQUlOX0NGR19CQVNFOwoKCQljcC0+bWFpbi5tbWFwWzBdLnJlZy5leGlzdHMgPSAxOwoJCWNwLT5tYWluLm1tYXBbMF0ucmVnLnNpemUgPSBGUEdBX01BSU5fUkVHX1NJWkU7CgkJY3AtPm1haW4ubW1hcFswXS5yZWcuYmFzZSA9IEZQR0FfTUFJTl9SRUdfQkFTRTsKCgkJY3AtPm1haW4ubW1hcFswXS5wb3J0LmV4aXN0cyA9IDE7CgkJY3AtPm1haW4ubW1hcFswXS5wb3J0LnNpemUgPSBGUEdBX01BSU5fUE9SVF9TSVpFOwoJCWNwLT5tYWluLm1tYXBbMF0ucG9ydC5iYXNlID0gRlBHQV9NQUlOX1BPUlRfQkFTRTsKCgkJY3AtPm1haW4uaW9waW5zWzBdLnByb2dfcGluLnBvcnQgPSBGUEdBX01BSU5fUFJPR19QT1JUOwoJCWNwLT5tYWluLmlvcGluc1swXS5wcm9nX3Bpbi5waW4gPSBGUEdBX01BSU5fUFJPR19QSU47CgkJY3AtPm1haW4uaW9waW5zWzBdLnByb2dfcGluLmZsYWcgPSAxOwoJCWNwLT5tYWluLmlvcGluc1swXS5pbml0X3Bpbi5wb3J0ID0gRlBHQV9NQUlOX0lOSVRfUE9SVDsKCQljcC0+bWFpbi5pb3BpbnNbMF0uaW5pdF9waW4ucGluID0gRlBHQV9NQUlOX0lOSVRfUElOOwoJCWNwLT5tYWluLmlvcGluc1swXS5pbml0X3Bpbi5mbGFnID0gMTsKCQljcC0+bWFpbi5pb3BpbnNbMF0uZG9uZV9waW4ucG9ydCA9IEZQR0FfTUFJTl9ET05FX1BPUlQ7CgkJY3AtPm1haW4uaW9waW5zWzBdLmRvbmVfcGluLnBpbiA9IEZQR0FfTUFJTl9ET05FX1BJTjsKCQljcC0+bWFpbi5pb3BpbnNbMF0uZG9uZV9waW4uZmxhZyA9IDE7CiNpZmRlZiBGUEdBX01BSU5fRU5BQkxFX1BPUlQKCQljcC0+bWFpbi5pb3BpbnNbMF0uZW5hYmxlX3Bpbi5wb3J0ID0gRlBHQV9NQUlOX0VOQUJMRV9QT1JUOwoJCWNwLT5tYWluLmlvcGluc1swXS5lbmFibGVfcGluLnBpbiA9IEZQR0FfTUFJTl9FTkFCTEVfUElOOwoJCWNwLT5tYWluLmlvcGluc1swXS5lbmFibGVfcGluLmZsYWcgPSAxOwojZW5kaWYKCX0gZWxzZQoJCXB1dHMgKCJFRVBST006bWFpbi4uLk5PVCBQUkVTRU5UXG4iKTsKCgkvKiBzZXQgdXAgbWV6emFuaW5lIGJvYXJkIGNvbmZpZyBpbmZvICovCgoJaWYgKGkyY19wcm9iZSAoQ0ZHX0kyQ19FRVBST01fQUREUiB8IEhZTU9EX0VFT0ZGX01FWlopKSB7CgoJCWlmIChyZWFkX2VlcHJvbQoJCQkoIm1lenoiLCBIWU1PRF9FRU9GRl9NRVpaIDw8IDgsICZjcC0+bWV6ei5lZXByb20pKQoJCQljcC0+bWV6ei5lZXByb21fdmFsaWQgPSAxOwoKCQlwdXRzICgiRUVQUk9NOm1lenouLi4iKTsKCgkJaWYgKGNwLT5tZXp6LmVlcHJvbV92YWxpZCkgewoJCQlwcmludGYgKCJPSyAodmVyICV1KVxuIiwgY3AtPm1lenouZWVwcm9tLnZlcik7CgkJCWVlcHJvbV9wcmludCAoJmNwLT5tZXp6LmVlcHJvbSk7CgkJfSBlbHNlCgkJCXB1dHMgKCJCQURcbiIpOwoKCQljcC0+bWV6ei5tbWFwWzBdLnByb2cuZXhpc3RzID0gMTsKCQljcC0+bWV6ei5tbWFwWzBdLnByb2cuc2l6ZSA9IEZQR0FfTUVaWl9DRkdfU0laRTsKCQljcC0+bWV6ei5tbWFwWzBdLnByb2cuYmFzZSA9IEZQR0FfTUVaWl9DRkdfQkFTRTsKCgkJY3AtPm1lenoubW1hcFswXS5yZWcuZXhpc3RzID0gMDsKCgkJY3AtPm1lenoubW1hcFswXS5wb3J0LmV4aXN0cyA9IDA7CgoJCWNwLT5tZXp6LmlvcGluc1swXS5wcm9nX3Bpbi5wb3J0ID0gRlBHQV9NRVpaX1BST0dfUE9SVDsKCQljcC0+bWV6ei5pb3BpbnNbMF0ucHJvZ19waW4ucGluID0gRlBHQV9NRVpaX1BST0dfUElOOwoJCWNwLT5tZXp6LmlvcGluc1swXS5wcm9nX3Bpbi5mbGFnID0gMTsKCQljcC0+bWV6ei5pb3BpbnNbMF0uaW5pdF9waW4ucG9ydCA9IEZQR0FfTUVaWl9JTklUX1BPUlQ7CgkJY3AtPm1lenouaW9waW5zWzBdLmluaXRfcGluLnBpbiA9IEZQR0FfTUVaWl9JTklUX1BJTjsKCQljcC0+bWV6ei5pb3BpbnNbMF0uaW5pdF9waW4uZmxhZyA9IDE7CgkJY3AtPm1lenouaW9waW5zWzBdLmRvbmVfcGluLnBvcnQgPSBGUEdBX01FWlpfRE9ORV9QT1JUOwoJCWNwLT5tZXp6LmlvcGluc1swXS5kb25lX3Bpbi5waW4gPSBGUEdBX01FWlpfRE9ORV9QSU47CgkJY3AtPm1lenouaW9waW5zWzBdLmRvbmVfcGluLmZsYWcgPSAxOwojaWZkZWYgRlBHQV9NRVpaX0VOQUJMRV9QT1JUCgkJY3AtPm1lenouaW9waW5zWzBdLmVuYWJsZV9waW4ucG9ydCA9IEZQR0FfTUVaWl9FTkFCTEVfUE9SVDsKCQljcC0+bWV6ei5pb3BpbnNbMF0uZW5hYmxlX3Bpbi5waW4gPSBGUEdBX01FWlpfRU5BQkxFX1BJTjsKCQljcC0+bWV6ei5pb3BpbnNbMF0uZW5hYmxlX3Bpbi5mbGFnID0gMTsKI2VuZGlmCgoJCWlmIChjcC0+bWV6ei5lZXByb21fdmFsaWQgJiYKCQkJY3AtPm1lenouZWVwcm9tLmJkdHlwZSA9PSBIWU1PRF9CRFRZUEVfRElTUExBWSkgewoJCQkvKgoJCQkgKiBtZXp6YW5pbmUgYm9hcmQgaXMgYSBkaXNwbGF5IGJvYXJkIC0gc3dpdGNoIHRoZSBTRUxfQ0QKCQkJICogaW5wdXQgb2YgdGhlIEZTNjM3NyBjbG9jayBnZW5lcmF0b3IgKHZpYSBJL08gUG9ydCBQaW4gUEExMSkgdG8KCQkJICogaGlnaCAob3IgMSkgdG8gc2VsZWN0IHRoZSAyN01IeiByZXF1aXJlZCBieSB0aGUgZGlzcGxheSBib2FyZAoJCQkgKi8KCQkJaW9waW5fc2V0X2hpZ2ggKCZwYTExKTsKCgkJCXB1dHMgKCJTRUxfQ0Q6dG9nZ2xlZCBmb3IgZGlzcGxheSBib2FyZFxuIik7CgkJfQoJfSBlbHNlCgkJcHV0cyAoIkVFUFJPTTptZXp6Li4uTk9UIFBSRVNFTlRcbiIpOwoKCWNwLT5jcmMgPQoJCQljcmMzMiAoMCwgKHVuc2lnbmVkIGNoYXIgKikgY3AsIG9mZnNldG9mIChoeW1vZF9jb25mX3QsIGNyYykpOwoKCWlmIChnZXRlbnYgKCJnbG9iYWxfZW52X2xvYWRlZCIpID09IE5VTEwpIHsKCgkJcHV0cyAoIioqKiBnbG9iYWwgZW52aXJvbm1lbnQgaGFzIG5vdCBiZWVuIGxvYWRlZFxuIik7CgkJcHV0cyAoIioqKiBmZXRjaGluZyBmcm9tIHNlcnZlciAoQ29udHJvbC1DIHRvIEFib3J0KVxuIik7CgoJCXJjID0gZmV0Y2hfYW5kX3BhcnNlIChnbG9iYWxfZW52X3BhdGgsIDB4MTAwMDAwLAoJCQkJCQkJICBlbnZfZmV0Y2hfY2FsbGJhY2spOwoKCQlpZiAocmMgPT0gMCkKCQkJcHV0cyAoIioqKiBGZXRjaCBvZiBlbnZpcm9ubWVudCBmYWlsZWQhXG4iKTsKCQllbHNlCgkJCXNldGVudiAoImdsb2JhbF9lbnZfbG9hZGVkIiwgInllcyIpOwoJfQoJcmV0dXJuICgwKTsKfQo=